【问题标题】:Passing a c library path from a conan package to a source file将 c 库路径从柯南包传递到源文件
【发布时间】:2021-06-24 16:02:38
【问题描述】:

我正在使用柯南来打包一个旧的 C 库。

库有一个加载过程,需要您从 .cpp 源文件中提供库的路径。如何从消费源内部访问 conan 打包 lib 的目录?

所以设置是这样的:

柯南包大致如下:

ole_c/0.0:
    
    |--include
    
       |-- ole_c_api.h
    
    |--bin
    
       |-- libole_c.so

消耗: consumer_main.cpp

那么consumer_main.cpp 包含ole_c_api.h 并且必须调用一个函数来传递libole_c.so 的路径。

如何将该路径传递给 consumer_main.cpp? 一种可能性是传递一个编译标志 -DPATH_TO_OLE_C_LIB= 然后可以通过 consumer_main.cpp 中的宏进行字符串化。如何从 cmake 内部或 ole_c 包装 conan.py 中访问 libole_c.so 的路径并适当地传递它?

【问题讨论】:

  • C/C++ 源文件与此无关。构建管理器会将信息传递给头文件和库所在的编译器和链接器。在源代码中唯一应该可见的是#include <ole_c_api.h>。 IMO 你应该阅读构建过程基础知识,conan 和 cmake 只是为此提供配置。
  • 我没有制作这个库,我也不喜欢它,但尽我所能从他们的文档中看出它是如何工作的。这第一个库似乎加载了一大堆库。套用它们:“当您加载库时,您指示系统加载共享对象文件并将所有函数指针设置为各自的值。这是通过调用 OLECLoadLibrary 完成的。此函数存在两个版本:如果您愿意,请使用 OLECLoadLibraryA使用 const char* 指定库路径。如果您希望使用 const wchar_t* 指定库路径,请使用 OLECLoadLibraryW。"

标签: c++ cmake conan


【解决方案1】:

您可以使用cmake generator expressions 获取目标库的路径。如果您在TARGETS 模式下使用柯南,那么您可以这样做:

target_compile_definitions(MyApp PRIVATE PATH_TO_OLE_C_LIB=$<TARGET_FILE:CONAN_PKG::ole_c>)

或者,您也可以在柯南配方中填充cpp-info.defines,并使用package_folder 属性来获取包的安装路径(我不确定这将如何运作)。

【讨论】:

  • 两种策略都有效!我喜欢第二个,因为您可以将定义包含在柯南包中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 2019-03-15
相关资源
最近更新 更多