使用 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".

但是,如果在我的文件系统和 src/CMakeLists.txt中都将 main.cpp 的扩展名更改为 main.c,那么一切都会按预期运行。这是从 VisualStudio 命令提示符(VisualStudio 解决方案生成器)和 Cygwin 终端(UnixMakefile 生成器)运行的情况。

知道为什么这个代码不能用吗?

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;
}
207412 次浏览

试试换衣服

PROJECT(HelloWorld C)

进入

PROJECT(HelloWorld C CXX)

或者只是

PROJECT(HelloWorld)

见: https://cmake.org/cmake/help/latest/command/project.html

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

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 + + 编译器,你可以 通过显式列出所需的语言来禁用该检查 通过使用特殊语言“ NONE”支持所有检查 对于任何语言,都可以禁用 CMAKE _ PROJECT _ _ INCLUDE _ FILE,它指向的文件 变量将作为项目命令的最后一步包括在内。

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

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

如果在 CMakeLists.txt 中列出源文件并错误地键入文件名,则会得到这个错误。

默认情况下,JNI 本机文件夹命名为 Jni。将其重命名为 心肺复苏术修复了这个问题

我在编译基于 C 的代码时也遇到了类似的错误。我通过纠正 cmake文件中的源文件路径解决了这个问题。请检查 cmake文件中提到的每个源文件的源文件路径。这个也许能帮到你。

我成功解决了我的问题,通过改变

add_executable(file1.cpp)

add_executable(ProjectName file1.cpp)

一个有点不相关的回答 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})

我想添加另一个解决方案的情况下,没有任何源文件的库应建立。这样的库也称为 标题库。默认情况下,add_library期望至少添加一个源文件,否则将发生上述错误。由于只有头库是相当常见的,因此 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 的信息。

只需检查源文件的路径(到相应的 cpp)