【问题标题】:Add linker flag in CMake and execute automatically a gcc command在 CMake 中添加链接器标志并自动执行 gcc 命令
【发布时间】:2021-04-10 10:47:25
【问题描述】:

也许这个线程可能与其他线程相似,但我需要一些帮助,因为我是 CMAKE 菜鸟。 我需要让以下命令在我的 IDE (Clion) 中自动执行。

g++ main.cpp -L dependences/lib -lpq -o main

如您所想,我的项目中名为“dependences”的目录中有libpq.dlllibpq.lib

我现在的CMakeList是这样的:

cmake_minimum_required(VERSION 3.15)
project(AccessoDB)

set(CMAKE_CXX_STANDARD 17)

add_executable(AccessoDB main.cpp)

target_link_libraries(AccessoDB pq)

但是我不知道如何获取那个目录下的库,以及如何在开头添加命令。 提前致谢

【问题讨论】:

  • 这能回答你的问题吗? CMake link to external library 这些答案中列出了在 CMake 中链接到外部库的方法,特别是 this 可能是最好的方法。

标签: c++ c cmake linker clion


【解决方案1】:

此答案假定 main.cppCMakeLists.txtdependencies 位于同一目录中。

除了-L dependencies/lib-o main 之外的所有命令行参数部分都已包含在CMakeLists.txt 文件中。

您可以使用link_directories 命令指定其他链接目录,但我个人更喜欢使用导入的库。

add_library(pq SHARED IMPORTED)
set_target_properties(pq PROPERTIES
    IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/lib/libpq.dll"
    IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/lib/libpq.lib")

-o main 可以通过更改OUTPUT_NAME(或RUNTIME_OUTPUT_NAME)目标属性来替换。请注意,这不会摆脱扩展;在这种情况下,您最终会得到main.exe。 (如果需要,您可以使用 SUFFIX 目标属性进行更改。)

set_target_properties(AccessoDB PROPERTIES OUTPUT_NAME main)

生成的 cmake 文件应如下所示。

cmake_minimum_required(VERSION 3.15)
project(AccessoDB)

set(CMAKE_CXX_STANDARD 17)

add_executable(AccessoDB main.cpp)
set_target_properties(AccessoDB PROPERTIES OUTPUT_NAME main)

# define the properties of pq library
add_library(pq SHARED IMPORTED)
set_target_properties(pq PROPERTIES
    IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/lib/libpq.dll"
    IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/lib/libpq.lib")

#include directories could be added too
# target_include_directories(pq INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/dependencies/include/pq")


target_link_libraries(AccessoDB pq)

请注意,运行 exe 时可能仍然存在问题,因为 .dll 可能不在 PATH 环境变量中列出的目录中,并且在运行 exe 时不会位于工作目录中。

【讨论】:

    猜你喜欢
    • 2014-09-08
    • 2021-07-20
    • 2014-08-23
    • 2020-03-12
    • 1970-01-01
    • 2021-01-02
    相关资源
    最近更新 更多