Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让CMake链接到源目录中的静态库中?_Cmake_Static Libraries - Fatal编程技术网

如何让CMake链接到源目录中的静态库中?

如何让CMake链接到源目录中的静态库中?,cmake,static-libraries,Cmake,Static Libraries,我有一个带有Makefile的小项目,我正试图将其转换为CMake,主要是为了获得使用CMake的经验。在本例中,该项目包含一个源文件(C++,尽管我不认为该语言特别相关)和一个我从别处复制的静态库文件。为了论证,假设库的源代码不可用;我只有.a文件和相应的头文件 我的手工生成文件包含以下生成规则: main: main.o libbingitup.a g++ -o main main.o libbingitup.a 这很好用。我如何告诉CMake复制这个?当然,并不是字面上的make

我有一个带有Makefile的小项目,我正试图将其转换为CMake,主要是为了获得使用CMake的经验。在本例中,该项目包含一个源文件(C++,尽管我不认为该语言特别相关)和一个我从别处复制的静态库文件。为了论证,假设库的源代码不可用;我只有.a文件和相应的头文件

我的手工生成文件包含以下生成规则:

main: main.o libbingitup.a
    g++ -o main main.o libbingitup.a
这很好用。我如何告诉CMake复制这个?当然,并不是字面上的makefile,而是包含一个等效链接命令的东西。我尝试过明显但天真的方法,比如

add_executable(main main.cpp libbingitup.a)

以及使用
链接_目录(.)
添加_库(bingitup STATIC IMPORTED)
等的各种东西,但迄今为止没有任何东西能够成功链接。我该怎么办



版本详细信息:Linux(Kubuntu 12.04)上的CMake 2.8.7和GCC 4.6.3

CMake倾向于传递链接库的完整路径,因此假设libbingitup.a位于
${CMake_SOURCE_DIR}
,执行以下操作应该会成功:

add_executable(main main.cpp)
target_link_libraries(main ${CMAKE_SOURCE_DIR}/libbingitup.a)

我觉得这很有帮助

从他们的例子来看:

ADD_LIBRARY(boost_unit_test_framework STATIC IMPORTED)
SET_TARGET_PROPERTIES(boost_unit_test_framework PROPERTIES IMPORTED_LOCATION /usr/lib/libboost_unit_test_framework.a)
TARGET_LINK_LIBRARIES(mytarget A boost_unit_test_framework C)

如果不想包含完整路径,可以这样做

add_executable(main main.cpp)
target_link_libraries(main bingitup)
bingitup
与您在CMake项目中创建静态库时给出的目标名称相同:

add_library(bingitup STATIC bingitup.cpp)
在Linux上,CMake会自动将
lib
添加到前端,并将
.a
添加到末尾,在Windows上会自动将
.lib
添加到末尾

如果库是外部的,您可能希望使用

link_directories(/path/to/libraries/)

我想添加到其他注释中,项目名称是第一个参数。我有一个名为cmakecompile的项目,我想在其中添加libusb,代码如下:

add_executable(cmakecompile main.c)
target_link_libraries(cmakecompile "D:/msys2/mingw64/lib/libusb-1.0.a")
该项目只有一个main.c文件,目标链接库中的第一个参数是项目的名称,第二个参数是库的路径

注意,这可能会有所帮助:因为我是在windows下编译的,所以我必须安装msys2,因为您必须使用相同的编译器编译库。例如,如果您获得并尝试在qt creator项目中使用它,它将不起作用,并且您可能会获得未引用的函数,因此我必须从msys2内部安装msys2并安装libusb,安装make并创建qt Cmake项目,并使用msys2 make从qt creator编译

完整的cmakelists.txt如下所示

cmake_minimum_required(VERSION 3.5)

project(cmakecompile LANGUAGES C)

add_executable(cmakecompile main.c)
target_link_libraries(cmakecompile "D:/msys2/mingw64/lib/libusb-1.0.a")

太好了,谢谢!在这里显式地输入完整路径似乎有点不妥,但我想这只是CMake的方式……我同意这似乎有些过分,但是如果您安装了同一个库的多个不同版本,显式地指定完整路径会带来好处。令人惊奇的是,一如既往!在我的例子中,解决了一个库依赖于另一个构建的动态库的问题,该动态库依赖于一个静态库:依赖库也尝试链接到此静态库。main如何知道包含目录?您需要使用or(前者是首选方法,因为它更具体)。关于INCLUDE_目录呢?只有当库是cmake构建的一部分时,这才有效,但如果库是外来的,则不起作用。问题是“该项目包含一个源文件(C++,尽管我不认为该语言特别相关)和一个我从其他地方复制的静态库文件。”如果存在同名的.a和.so文件,您如何指定要与.a或.so链接?在这种情况下?@George:您不能。如果两种类型都存在,请包含要链接的文件的全名。如果您想用其他信息来扩展其他答案,您能否澄清您想添加的内容以及您认为有必要添加的原因?我正在添加其他细节,这一点很重要,例如如果这是针对qt而不是visual studio,那么应该遵循哪条路径。另外,编译所需的最小cmake内容是多少。我记得我曾经在第二天努力寻找这些信息,这就是我为社区提供这些信息的原因。
cmake_minimum_required(VERSION 3.5)

project(cmakecompile LANGUAGES C)

add_executable(cmakecompile main.c)
target_link_libraries(cmakecompile "D:/msys2/mingw64/lib/libusb-1.0.a")