114

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

我手工制作的 Makefile 包含这个构建规则:

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 (Kubuntu 12.04) 上的 CMake 2.8.7 和 GCC 4.6.3

4

4 回答 4

141

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

add_executable(main main.cpp)
target_link_libraries(main ${CMAKE_SOURCE_DIR}/libbingitup.a)
于 2012-12-29T02:39:38.143 回答
38

如果您不想包含完整路径,则可以执行

add_executable(main main.cpp)
target_link_libraries(main bingitup)

bingitup如果您在 CMake 项目中创建静态库,则与您给出的目标名称相同:

add_library(bingitup STATIC bingitup.cpp)

CMake 会在 Linux 上自动添加lib到前面和末尾,在 Windows 上添加到末尾。.a.lib

如果库是外部的,您可能希望使用添加到库的路径

link_directories(/path/to/libraries/)
于 2017-01-05T21:42:01.857 回答
26

我发现这很有帮助...

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)
于 2015-07-21T16:20:19.350 回答
1

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

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

该项目只有一个 main.c 文件,target_link_libraries 中的第一个参数是您的项目名称,第二个参数是库的路径

请注意,这可能会有所帮助:由于我在 Windows 下编译,因此我必须安装 msys2,因为您必须使用相同的编译器编译该库。例如,如果您获得libusb并尝试在 qt-creator 项目中使用它,它将无法工作,并且您可能会获得未引用的功能,因此我必须安装 msys2 并从 msys2 内部安装 libusb,安装 make 并创建一个 QT Cmake 项目并使用 msys2 make 从 Qt 创建者编译。

完整的 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")
于 2021-03-07T11:31:16.497 回答