web-dev-qa-db-ja.com

CMakeはC ++でリンカー言語を決定できません

Visual Studio 2010とCygwinの両方を使用してWindows 7 x64でcmake hello worldプログラムを実行しようとしていますが、どちらも機能しないようです。私のディレクトリ構造は次のとおりです。

HelloWorld
-- CMakeLists.txt
-- src/
-- -- CMakeLists.txt
-- -- main.cpp
-- build/

cd buildに続いてcmake ..を実行すると、それを示すエラーが表示されます

CMake Error: CMake can not determine linker language for target:helloworld
CMake Error: Cannot determine link language for target "helloworld".

ただし、filsystemとsrc/CMakeLists.txtの両方でmain.cppの拡張子をmain.cに変更すると、すべてが期待どおりに機能します。これは、Visual Studioコマンドプロンプト(Visual Studio Solution Generator)とCygwin Terminal(Unix Makefiles Generator)の両方から実行する場合です。

このコードが機能しない理由は何ですか?

CMakeLists.txt

PROJECT(HelloWorld C)
cmake_minimum_required(VERSION 2.8)

# include the cmake modules directory
set(CMAKE_MODULE_PATH ${HelloWorld_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})

add_subdirectory(src)

src/CMakeLists.txt

# Include the directory itself as a path to include directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# Create a variable called helloworld_SOURCES containing all .cpp files:
set(HelloWorld_SOURCES main.cpp)

# Create an executable file called helloworld from sources:
add_executable(hello ${HelloWorld_SOURCES })

src/main.cpp

int main()
{
  return 0;
}
62
Chris Covert

変更してみてください

PROJECT(HelloWorld C)

PROJECT(HelloWorld C CXX)

あるいは単に

PROJECT(HelloWorld)

参照: http://www.cmake.org/cmake/help/v2.8.8/cmake.html#command:project

34
olovb

私はあなたが言及したエラーも受け取りました:

CMake Error: CMake can not determine linker language for target:helloworld
CMake Error: Cannot determine link language for target "helloworld".

私の場合、これは.cc拡張子を持つC++ファイルがあるためでした。

CMakeがコードの言語を正しく判断できない場合は、次を使用できます。

set_target_properties(hello PROPERTIES LINKER_LANGUAGE CXX)

project()ステートメントに言語を追加することを提案する受け入れられた答えは、使用されている言語のより厳密なチェックを追加するだけです(ドキュメントに従って)が、それは私には役に立たなかった:

オプションで、プロジェクトがサポートする言語を指定できます。言語の例は、CXX(C++)、C、Fortranなどです。デフォルトでは、CおよびCXXが有効になっています。例えば。 C++コンパイラがない場合は、サポートしたい言語を明示的にリストすることにより、チェックを無効にできます。 C.特別な言語「NONE」を使用することにより、すべての言語のすべてのチェックを無効にできます。 CMAKE_PROJECT__INCLUDE_FILEという変数が存在する場合、その変数が指すファイルはプロジェクトコマンドの最後のステップとして含まれます。

131
Joakim

私の場合、ターゲットにソースファイルがなかったからです。私のライブラリはすべて、ヘッダーにソースコードを含むテンプレートでした。空のfile.cppを追加すると、問題は解決しました。

49
Moebius

紛らわしいかもしれませんが、プロジェクトに含まれているcppファイルが存在しない場合にもエラーが発生します。

ソースファイルをCMakeLists.txtにリストし、誤ってファイル名を入力すると、このエラーが発生します。

10
Jolly Roger

また、Cベースのコードをコンパイルしているときに、同様のエラーに直面しました。 cmakeファイルのソースファイルパスを修正することで問題を修正しました。 cmakeファイルに記載されている各ソースファイルのソースファイルパスを確認してください。これもあなたを助けるかもしれません。

2
user2999709

デフォルトでは、JNI Nativeフォルダーの名前はjniです。名前をcppに変更すると、問題が修正されました

0
HimalayanCoder

OPには少し無関係な答えですが、多少似たような問題を抱えている私のような人々のために。

ユースケース:Ubuntu(C、Clion、オートコンプリート):

同じエラーが発生しましたが、

CMakeエラー:ターゲット「hello」のリンク言語を判別できません。

set_target_properties(hello PROPERTIES LINKER_LANGUAGE C)ヘルプはその問題を修正しますが、ヘッダーはプロジェクトに含まれておらず、オートコンプリートは機能しません。

これは私が持っていたものです

cmake_minimum_required(VERSION 3.5)

project(hello)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES ./)

add_executable(hello ${SOURCE_FILES})

set_target_properties(hello PROPERTIES LINKER_LANGUAGE C)

エラーはありませんが、必要なものではありません。ソースとして1つのファイルを含めると、オートコンプリートが行われ、リンカーがCに設定されることに気付きました。

cmake_minimum_required(VERSION 3.5)

project(hello)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES ./1_helloworld.c)

add_executable(hello ${SOURCE_FILES})
0
fayz

変えて、なんとか解決できた

add_executable(file1.cpp)

add_executable(ProjectName file1.cpp)
0
AKJ