如何告诉 CMake 在源目录中的静态库中进行链接?

我有一个小项目与 Makefile,我试图转换到 CMake,主要是为了获得经验与 CMake。对于这个示例,项目包含一个源文件(C + + ,尽管我不认为该语言是特别相关的)和一个静态库文件,我已经从其他地方复制了这个文件。出于参数的考虑,假设库的源代码不可用; 我只有。一个文件和相应的头。

My handmade Makefile contains this build rule:

main: main.o libbingitup.a
g++ -o main main.o libbingitup.a

效果不错。我怎么告诉 CMake 复制这个?当然,不是字面上的这个 makefile,而是包含一个等效的链接命令。我试过很明显但很天真的方法

add_executable(main main.cpp libbingitup.a)

或者

add_executable(main main.cpp)
target_link_libraries(main libbingitup.a)

以及各种与 link_directories(.)add_library(bingitup STATIC IMPORTED)等,但没有到目前为止,导致一个成功的连锁。我应该做什么?


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

277286 次浏览

CMake 支持传递链接库的完整路径,因此假设 libbingitup.a 在 ${CMAKE_SOURCE_DIR}中,执行以下操作应该会成功:

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

我觉得这个很有用。

Http://www.cmake.org/pipermail/cmake/2011-june/045222.html

以他们为例:

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 is the same name you'd give a target if you create the static library in a CMake project:

add_library(bingitup STATIC bingitup.cpp)

CMake automatically adds the lib to the front and the .a at the end on Linux, and .lib at the end on Windows.

If the library is external, you might want to add the path to the library using

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 文件,target _ link _ library 中的第一个参数是 项目名称,第二个参数是 图书馆的路径

注意,这可能会有帮助 : 因为我是在 windows 下编译的,所以我必须安装 msys2,因为必须使用相同的编译器来编译库。例如,如果你得到了 libusb并试图在一个 QT 创建者项目中使用它,它不会工作,你可能会得到未引用的函数,因此我必须安装 msys2并从 msys2内部安装 libusb,安装 make 并创建一个 QT Cmake 项目,并使用 msys2 make 从 QT 创建者进行编译。

The full cmakelists.txt is as follow

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")