使用cmake的ExternalProject_Add时,在运行时避免路径问题

时间:2017-07-07 10:31:01

标签: c++ c++11 makefile cmake

我对 cmake 很陌生,但我仍然坚持一种我想要理解和克服的奇怪行为。

我创建了一个使用Paho MQTT C library的可执行文件。这个可执行文件的内容是无关紧要的,让我们说它现在只是连接到代理,没什么特别的。

要编译我的程序,我使用cmakeCMakeLists.txt文件,它可以做一些事情:

  • 使用ExternalProject块从Github
  • 中提取MQTT C lib
  • 声明可执行文件和链接的库

这是:

project(myproject)
include(ExternalProject)

########## CMAKE VERSION AND FLAGS ##########

cmake_minimum_required(VERSION 3.1 FATAL_ERROR)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin)

########## MQTT EXTERNAL LIB ##########

set(MQTT_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/mqtt)
ExternalProject_Add(
    project_mqtt
    GIT_REPOSITORY https://github.com/eclipse/paho.mqtt.c
    GIT_TAG v1.2.0
    PREFIX ${MQTT_BUILD_DIR}
    CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}"
)
add_library(mqtt STATIC IMPORTED)

set(MQTT_LIB ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/lib/libpaho-mqtt3a.1.2.0.dylib)
set_property(TARGET mqtt PROPERTY IMPORTED_LOCATION ${MQTT_LIB})

add_dependencies(mqtt project_mqtt)
include_directories(${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/include)
link_directories(${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/lib)

########## EXECUTABLE ##########

add_executable(myproject ../src/main.cpp)
target_link_libraries(myproject mqtt)
  

请注意,在我特别为Mac编译的文件中,我对.dylib后缀进行了硬编码,但这不是问题

我的文件夹结构如下:

myproject/
 -- CMakeLists.txt
 -- bin/
 -- build/
 -- src/
    - main.cpp

我的编译工作流程非常标准:cd build && cmake ../ && make

我的来源位于/src,我在/build中构建了所有内容,而我的可执行文件则在/bin中编写。由于我不想在系统中安装{{1>我希望我的项目自包含一种方式)。

效果很好我的意思是,它会编译)。

但是当我运行该程序时,我收到*.dylib错误。

..这很正常"正常",因为我的lib已安装在bin/lib中,我的可执行文件在其自己的文件夹(dyld: Library not loaded: libpaho-mqtt3a.1.dylib)中搜索它们。因此,例如,如果我运行:bin/lib,它的效果非常好。

所以,现在我的问题是:

  1. [哲学上]这是一个好方法吗?我想使用这个外部库,但我不想在我的代码中包含Paho lib源代码,所以我觉得ExternalProject是一个很好的方法。它在编译我的项目之前在编译时编译lib,我发现这个过程非常方便。我找了一个"包经理"对于C ++,似乎没有一个强烈的共识(我正在寻找类似* composer *或* npm * for web apps 的东西),所以我没有走这条路。 / p>

  2. 为什么,为什么,我的可执行文件在其自己的目录bin/中查找库文件?我可以改变吗?我错过了一些 cmake 配置吗?我想我可以使用 cmake 自定义命令将库文件复制到cd bin/lib && ../myproject文件夹中,但这看起来像是对我的黑客攻击。不是吗?

  3. 老实说,我希望没有"路径依赖"在我的可执行文件中,可以说在特定系统上编译时,可执行文件可以放在这个系统的任何地方,然后可以完美地工作。我理解这意味着编译的Paho MQTT lib应该静态 in 我的可执行文件,但我想知道如何做到这一点(甚至真正实际上意味着什么)。有可能吗?

  4. 我可能会错过C / C ++编译和外部lib工作流如何工作的一部分,但我认为我接近于非常强大的东西,它只是运行时的这个lib路径,我会喜欢正确理解和修复。

    我对这方面的建议非常开放 非常感谢!

0 个答案:

没有答案