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


90

Visual Studio2010とCygwinの両方を使用してWindows7x64でcmakehello 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".

ただし、ファイルシステムとsrc/CMakeLists.txtすべての両方でmain.cppの拡張子をmain.cに変更すると、期待どおりに機能します。これは、Visual Studioコマンドプロンプト(Visual Studio Solution Generator)とCygwinターミナル(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;
}

「[...] main.cppの拡張子を変更した場合[...]」何に変更しますか?.cc?
JAB 2012

おっと。偶然にそれを省きました。'.c'に変更します。元の投稿で編集されました。cppコンパイラなどはないと思われがちですが、g ++はインストールされており、VisualStudioでもc ++に問題はないはずです。
Chris Covert 2012

回答:



184

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

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という変数が存在する場合、その変数が指すファイルは、プロジェクトコマンドの最後のステップとして含まれます。


私の場合、ファイルの拡張子は.hppでした。これで解決しました!
ブラウナー

私にとっても同じですが、.hppファイルとこれで修正されました。
KulaGGin

71

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


6
ターゲットプロパティの設定は、cppファイルがない問題でも機能します。
デニススキッドモア2016

1
先端の称賛。またsrc、新しく作成したcmakeプロジェクト(共有ライブラリ)のそれぞれのサブディレクトリにソースを移動することを忘れました。これが基本的に問題全体の原因でした。そのような場合、cmakeプロジェクトの構造を処理するウィザードを持っていることを本当に感謝しています。:D
rbaleksandar 2016年

ここでも同じ理由(コピーと貼り付けの間違い)。ありがとう!
Vivit 2016年

2
役立つヒント。「ライブラリ」がヘッダーのみの場合でも、ファイル#includeごとにを実行する.cppファイルを1つ作成する必要があります。ライブラリのコンパイル時に出力はありませんが、ファイルの構文チェックを実行し、見逃した可能性のあるヘッダーの依存関係(システムヘッダーなど)もチェックします。
マーク・Lakata

それはそれと同じくらい簡単です。パスにタイプミスがあると、ソースに* .cppファイルがありません。その後は大丈夫です。ありがとうございました!
RahulDas20年

17

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

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


コメント欄のようにしてください。
virb 2018

1
これは、他の回答が言ったこととは独立しているため、独自の回答として機能します。また、これは私の問題を修正しました。
20

5

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)

エラーはありませんが、必要なものではありません。ソースとして単一のファイルを含めると、オートコンプリートが取得され、リンカーがに設定されることに気付きました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})

CXX_FLAGSを使用してC ++標準バージョンを設定していることに気づき、CXX_STANDARD変数について言及したいと思いました。これはcmake.org/cmake/help/latest/prop_tgt/CXX_STANDARD.htmlの推奨される方法で あり、 cmake 3.5で利用可能
ChrisCovert19年

2

Cベースのコードのコンパイル中にも同様のエラーが発生しました。ファイル内のソースファイルのパスを修正することで問題を修正しましたcmake。ファイルに記載されている各ソースファイルのソースファイルパスを確認してくださいcmake。これも役立つかもしれません。


1

ソースファイルのないライブラリをビルドする場合に備えて、別のソリューションを追加したいと思います。このようなライブラリは、ヘッダーのみのライブラリとも呼ばれます。デフォルトでadd_libraryは、少なくとも1つのソースファイルが追加されていると想定されます。そうでない場合、上記のエラーが発生します。ヘッダーのみのライブラリは非常に一般的であるため、cmakeにはそのINTERFACEようなライブラリを構築するためのキーワードがあります。INTERFACEキーワードは、以下のように使用し、それがライブラリに追加空のソースファイルの必要性を排除しています。

add_library(myLibrary INTERFACE)
target_include_directories(myLibrary INTERFACE {CMAKE_CURRENT_SOURCE_DIR})

上記の例では、CMakeLists.txtと同じディレクトリにあるすべてのヘッダーファイルを含むヘッダーのみのライブラリを構築します。{CMAKE_CURRENT_SOURCE_DIR}ヘッダーファイルがCMakeLists.txtファイルとは異なるディレクトリにある場合は、パスに置き換えてください。

ヘッダーのみのライブラリとcmakeの詳細については、このブログ投稿またはcmakeのドキュメントをご覧ください。


0

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


-2

変更することで、なんとか解決できました

add_executable(file1.cpp)

add_executable(ProjectName file1.cpp)

-2

私の場合、クラスのメンバー関数をヘッダーファイルに実装すると、このエラーが発生します。インターフェイス(xhファイル内)と実装(x.cppファイル内)を分離すると、問題が解決します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.