【问题标题】:CMake unable to determine linker language with C++CMake 无法使用 C++ 确定链接器语言
【发布时间】:2012-08-01 19:47:36
【问题描述】:

我正在尝试使用 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 解决方案生成器)和 Cygwin 终端(Unix Makefiles 生成器)运行的情况。

知道为什么这段代码不起作用吗?

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?
  • 哎呀。不小心把它漏掉了。我将其更改为“.c”。在原帖中编辑。这几乎让我觉得没有 cpp 编译器或类似的东西,但是 g++ 已安装,Visual Studio 也不应该有 c++ 问题。

标签: c++ c cmake


【解决方案1】:

我也收到了你提到的错误:

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

在我的例子中,这是因为 C++ 文件的扩展名为 .cc

如果 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 文件,这修复了它。
【解决方案2】:

就我而言,这只是因为目标中没有源文件。我所有的代码都是一个模板,头文件中有源代码。添加一个空文件.cpp 解决了这个问题。

【讨论】:

  • 设置目标属性也适用于无 cpp 文件问题。
  • 感谢小费。我也确实忘记将我的资源移动到我新创建的cmake 项目(共享库)的相应src 子目录中,这基本上是整个问题的原因。在这种情况下,您真的很欣赏有一个向导来处理您的cmake 项目的结构。 :D
  • 这里的原因相同(复制粘贴错误)。谢谢!
  • 有用的提示。即使您的“库”只是标题,您也应该创建一个 .cpp 文件,为每个文件执行 #include。即使你的库编译时没有输出,它也会对你的文件进行语法检查,并检查你可能错过的头文件依赖项(例如系统头文件)。
  • 我认为理论上正确的方法是将您的仅标头库配置为 INTERFACE 库,并将该目标上的接口包含目录设置为您的标头位置。然后,当您想在应用程序中使用它时(例如,您的测试应用程序,它将成为可执行目标),您可以“链接”它。这样做的好处是使安装变得简单,CMake 甚至会为您生成导出的目标,其他项目可以使用 find_package() 找到这些目标。
【解决方案3】:

尝试改变

PROJECT(HelloWorld C)

进入

PROJECT(HelloWorld C CXX)

或者只是

PROJECT(HelloWorld)

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

【讨论】:

  • 这对我没有帮助。链接器错误仍然存​​在,请参阅我的回答以解决问题。
【解决方案4】:

虽然可能令人困惑,但当项目中包含的 cpp 文件不存在时也会发生错误。

如果您在 CMakeLists.txt 中列出源文件并错误地输入了文件名,则会收到此错误。

【讨论】:

  • 这可以作为自己的答案,因为它独立于其他答案所说的内容。这也解决了我的问题。
【解决方案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})

【讨论】:

【解决方案6】:

如果要构建没有任何源文件的库,我想添加另一个解决方案。这样的库也称为header only 库。默认情况下,add_library 需要添加至少一个源文件,否则会出现上述错误。由于只有头文件的库很常见,cmake 有 INTERFACE 关键字来构建这样的库。 INTERFACE 关键字的使用如下所示,它消除了将空源文件添加到库中的需要。

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

上面的示例将构建一个仅包含头文件的库,包括与 CMakeLists.txt 位于同一目录中的所有头文件。如果您的头文件与 CMakeLists.txt 文件位于不同的目录中,请将 {CMAKE_CURRENT_SOURCE_DIR} 替换为路径。

查看blog postcmake documentation 以获取有关仅标头库和 cmake 的更多信息。

【讨论】:

    【解决方案7】:

    在编译基于 C 的代码时,我也遇到了类似的错误。我通过更正我的cmake 文件中的源文件路径解决了这个问题。请检查您的cmake 文件中提到的每个源文件的源文件路径。这也可能对您有所帮助。

    【讨论】:

      【解决方案8】:

      只需检查源文件的路径。 (到各自的 cpp)

      【讨论】:

        【解决方案9】:

        默认情况下,JNI Native 文件夹被命名为 jni 。将其重命名为 cpp 解决了问题

        【讨论】:

          【解决方案10】:

          我设法通过改变解决了我的问题

          add_executable(file1.cpp)
          

          add_executable(ProjectName file1.cpp)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-02-06
            • 1970-01-01
            • 2019-03-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多