尝试使用 CMake 添加库会导致错误

Posted

技术标签:

【中文标题】尝试使用 CMake 添加库会导致错误【英文标题】:Trying to add libraries with CMake results in error 【发布时间】:2019-08-21 15:48:52 【问题描述】:

我正在尝试将外部 .lib 文件添加到我在 Clion 中使用 CMake 的项目中。我的代码很简单,只是为了测试这个库是否被包含:

#include <iostream>
#include "header/test.h"
int main() 
test a; // returns error saying undefined reference to 'test::test()'
return 0;

运行此代码时出现以下错误:

 undefined reference to `test::test()'

这是因为我正在尝试制作一个测试对象,但不包括用于测试的库。

test.lib 文件和 test.h 文件都在我的项目文件夹根目录下的“header”文件夹中。这个的文件路径是 F:\Project\header\

我的Cmake文本文件如下:

cmake_minimum_required(VERSION 3.14)
project(Project)

set(CMAKE_CXX_STANDARD 14)

add_executable(Project main.cpp)
target_link_libraries(Project 
F:\\Project\\header\\test.lib)

在 cmake 文本文件中,我使用以下行: target_link_libraries(项目 F:\Project\header\test.lib)

这应该包括库文件,但似乎没有,因为我收到了上面提到的“未定义的对...的引用”错误。 Cmake 编译器没有给我错误。

【问题讨论】:

通常,使用find_package 完成查找库。您要使用的库是什么?也许他们正确地导出了他们的目标,而你只需要一个前缀路径 CMakeLists.txt 正确,与库的链接已执行。似乎您的 F:\Project\header\test.lib 确实未定义给定函数 (test::test) 或以 不兼容 方式进行。可以通过检查test.lib sources 的代码来检查第一个替代方案(将该代码添加到问题帖子中)。至于第二种选择,您如何构建test.lib 库?也使用 CLion,还是使用其他编译器? 【参考方案1】:

您在概念上是正确的,但是您并没有以 CMake 方式进行操作。查看以下链接了解如何链接外部库。

CMake link to external library

cmake doesn't support imported libraries?

https://gitlab.kitware.com/cmake/community/wikis/doc/tutorials/Exporting-and-Importing-Targets

对于您的情况,如下所示):

cmake_minimum_required(VERSION 3.14)
project(Project)

set(CMAKE_CXX_STANDARD 14)

# Import the library into the CMake build system
ADD_LIBRARY(test SHARED IMPORTED)

# Specify the location of the library 
SET_TARGET_PROPERTIES(TARGET test PROPERTIES IMPORTED_LOCATION “/path/to/lib/test.dll”)

# create the executable   
add_executable(Project main.cpp)

# Link your exe to the library
target_link_libraries(Project test)

CMake 文档非常好。我建议您在遇到问题时检查一下。

https://cmake.org/cmake/help/latest/command/add_library.html#imported-libraries

【讨论】:

导入库需要设置IMPORTED_LOCATIONINTERFACE_INCLUDE_DIRECTORY 我明白了。我已经尝试过您所说的,并将 test.lib 与我的 cmake 文本文件一起移动到文件夹中。我现在收到错误:No rule to make target 'test-NOTFOUND', needed by 'Project.exe'. Stop. @GuillaumeRacicot 你是对的,谢谢。我会更新我的答案。 我已经尝试了您所说的以及其他各种方法,包括移动我的 .lib 文件。我的代码与您的代码完全相同,除了:set_target_properties(test PROPERTIES IMPORTED_LOCATION "$CMAKE_SOURCE_DIR/test.lib") 返回的错误是cannot find -llibrary collect2.exe: error: ld returned 1 exit status 知道为什么吗?我的 .lib 文件与我的 cmakelist.txt 位于同一目录中,我知道 $CMAKE_SOURCE_DIR/test.lib 指向它。 给出的答案并不能解决问题中所述的问题:在解决了这个CMakeLists.txt的所有问题后,它使用相同的参数调用编译器和链接器,就像在问题帖子中一样。所以它会发出与提问者想要解决的相同的错误。那么,为什么给出的答案在这里?如果您想显示链接外部库的通用方式,您需要回答CMake link to external library 问题,而不是给定问题。

以上是关于尝试使用 CMake 添加库会导致错误的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studios 2012 更改运行时库会导致链接错误,使用 C++

gcc:在 C++ 应用程序中链接 C 库会导致“多重定义”错误

带有 SDL 的 CMake 导致错误

添加 Android Image Cropper 库会引发错误

尝试添加外部库时出现 CMake 错误

将新对象插入存储库会引发错误