gpt4 book ai didi

c++ - 在动态 qt 库中导出符号

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:58:24 24 4
gpt4 key购买 nike

我正在尝试在 OS X 10.6.7 和 Qt 4.7.3 上使用 Qt 创建一个动态库。我已经创建了我能想到的最基本的测试(见下文或 https://gist.github.com/1016045)但是

otool -T build/libstackoverflow.dylib 

仍然报道

build/libstackoverflow.dylib:
Table of contents (0 entries)
module index symbol index

我假设我应该在该列表中看到与阶乘相关的其他内容。

测试用例(也位于:https://gist.github.com/1016045):

// main.cpp

#include <stdint.h>
#include <QtCore/QtGlobal>

#if defined(MYSHAREDLIB_LIBRARY)
# define MYSHAREDLIB_EXPORT Q_DECL_EXPORT
#else
# define MYSHAREDLIB_EXPORT Q_DECL_IMPORT
#endif

MYSHAREDLIB_EXPORT uint64_t factorial(int max) {
int i = max;
uint64_t result = 1;

while (i >= 2)
result *= i--;

return result;
}


// stackoverflow.pro

TEMPLATE = lib
DEFINES += MYSHAREDLIB_LIBRARY
CONFIG += qt dll
TARGET =
DEPENDPATH += .
INCLUDEPATH += .
DESTDIR = ./build

# Input
SOURCES += main.cpp

构建:

qmake
make

我读过:

如果适用,请推荐其他资源!

编辑:

我相信这些符号可能会被正确导出,尽管它们的名称被破坏了(或者至少看起来是),我认为使用 Q_DECL_EXPORT 宏应该可以避免这种情况。例如,这是运行 nm -g build/libstackoverflow.dylib 的结果:

0000000000001f20 T __Z9factoriali
U ___gxx_personality_v0
U dyld_stub_binder

这是我应该期待的吗?

最佳答案

我认为仅导出不会禁用 C++ 名称修改。如果您有“纯 C”函数,您希望在不进行修改的情况下导出,您需要将它们的声明包装在 extern "C"{} block 中(当然最好在 header 中)。

只要“客户端”代码也是使用 C++ 编译器编译的,名称修改就不会阻止成功链接。如果您希望它们都可用于 C 和 C++,则根据 C/C++ 编译器有条件地定义的 extern "C" 是必需的 AFAIK。

关于c++ - 在动态 qt 库中导出符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6287841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com