【问题标题】:Is it possible to specify specific flags/define for DLL/SO build?是否可以为 DLL/SO 构建指定特定的标志/定义?
【发布时间】:2010-01-01 14:08:15
【问题描述】:

如何为仅 DLL 构建指定一些唯一标志。默认情况下,libtool 添加了-DDLL_EXPORT,这对于大多数遵循 GNU 约定的项目来说都很好,但是如果我使用 Boost,例如,我可能需要为我的库标志指定:-DDLL_EXPORT -DBOOST_ALL_DYN_LINK for DLL only builds,有时我也想要条件构建,所以我需要一些特定的 DLL/SO 构建定义。

很遗憾,我找不到如何使用 libtool 执行此操作的方法,我应该使用哪些标志?

P.S.:甚至不要试图建议迁移到 CMake。

示例:

我使用链接到 bar 的库 foo,并且只需要 -DBAR_EXPORTS 来获取动态库的符号。

有没有类似的

 libfoo_la_dynamic_CXXFLAGS = -DBAR_EXPORTS

有人吗?

替代方案:(相当丑陋)

创建一个文件`defines.h

#if defined(PIC) || defined(DLL_EXPORT)
#define BAR_EXPORTS
#endif

然后:

 libfoo_la_CXXFLAGS += -include defines.h

丑陋但应该可以。

【问题讨论】:

    标签: c++ dll build-automation automake libtool


    【解决方案1】:

    您可以默认禁用构建共享库

    LT_INIT([disable-shared])
    

    然后您可以使用AM_CONDITIONAL--enabled-shared 结合使用,并在明确请求共享库时设置额外的定义。 IOW,启用静态或共享构建,但不能同时构建。

    【讨论】:

    • @Artyom 也许有,但我不知道。我只在 Unix 上使用 Autotools,我避免在 Windows 上使用它来构建 DLL。
    【解决方案2】:

    不是很漂亮,但是您可以使用conditional 来检查是否定义了 DLL_EXPORT 以及是否定义了您需要的其他内容?

    我不太擅长自动工具,我更喜欢 CMake,但你似乎很反对。

    【讨论】:

    • am_conditional 是项目全局的,但是,通常当您使用 libtool 构建时,您会构建静态库和共享库。所以这不是真正的解决方案。
    猜你喜欢
    • 2019-10-02
    • 2012-08-16
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    相关资源
    最近更新 更多