QtCreator:动态库是否真的在 Mac 上生成 "dynamic"
QtCreator: Are dynamic library generated really "dynamic" on a Mac
我正在 MacOS 下使用 QtCreator 为我的应用程序定位 iPhone。现在,我正在尝试编译第 3 方库 (tinyxml)。
我的 .pro 文件已经适用于 Linux、Windows 和 Android 目标,我只是想将它扩展到 iOS.
我的第一个惊喜是生成的动态库有一个.a
扩展名。不应该是 .so
(甚至是 `.dynlib)吗?
我的第二个惊喜是,当我生成带和不带CONFIG += staticlib
的库时,它总是生成相同的二进制文件(实际上,相同的大小,内容被报告为不同,但它可能只是SONAME 标签)。在所有其他平台上,静态和动态库二进制文件的大小始终不同。
我做错了什么吗?我实际上总是静态生成库吗(这将解释扩展总是 .a
),如果是这样,如何强制动态生成?
动态 .pro 文件:
#Generated by SDE CMake scripts!
CONFIG(release, debug|release) {
TARGET = tinyxml
}
CONFIG(debug, debug|release) {
TARGET = tinyxml-g
}
QT -= core
QT -= gui
CONFIG(debug, debug|release) {
DEFINES += _DEBUG
}
win32: DEFINES += TINYXML_EXPORTS
SOURCES += \
/Users/less/Documents/dev/vobs_ext/libcpp/tinyxml/src/tinystr.cpp \
/Users/less/Documents/dev/vobs_ext/libcpp/tinyxml/src/tinyxml.cpp \
/Users/less/Documents/dev/vobs_ext/libcpp/tinyxml/src/tinyxmlerror.cpp \
/Users/less/Documents/dev/vobs_ext/libcpp/tinyxml/src/tinyxmlparser.cpp
TEMPLATE = lib
INCLUDEPATH += \
/Users/less/Documents/dev/vobs_ext/libcpp/tinyxml/./tinyxml
静态 .pro 文件:
#Generated by SDE CMake scripts!
CONFIG(release, debug|release) {
TARGET = tinyxmls
}
CONFIG(debug, debug|release) {
TARGET = tinyxmls-g
}
QT -= core
QT -= gui
CONFIG(debug, debug|release) {
DEFINES += _DEBUG
}
win32: DEFINES += TINYXML_EXPORTS
QMAKE_CXXFLAGS += -DTINYXML_STATIC
SOURCES += \
/Users/less/Documents/dev/vobs_ext/libcpp/tinyxml/src/tinystr.cpp \
/Users/less/Documents/dev/vobs_ext/libcpp/tinyxml/src/tinyxml.cpp \
/Users/less/Documents/dev/vobs_ext/libcpp/tinyxml/src/tinyxmlerror.cpp \
/Users/less/Documents/dev/vobs_ext/libcpp/tinyxml/src/tinyxmlparser.cpp
TEMPLATE = lib
CONFIG += staticlib
INCLUDEPATH += \
/Users/less/Documents/dev/vobs_ext/libcpp/tinyxml/./tinyxml
知道了。
对于 windows 和 Android 目标,默认的库构建是动态的,所以除了 TEMPLATE += lib
之外,我从来不需要放置任何其他东西。在 Mac 上,默认情况下它是静态的。因此,要生成动态库 (.dylib),您必须通过添加 CONFIG += shared
.
来请求它
这可以编译,但在部署时会崩溃。我在另一个线程上发布了这个:QtCreator for iOS: How to deploy a dylib shared library with my application
我正在 MacOS 下使用 QtCreator 为我的应用程序定位 iPhone。现在,我正在尝试编译第 3 方库 (tinyxml)。
我的 .pro 文件已经适用于 Linux、Windows 和 Android 目标,我只是想将它扩展到 iOS.
我的第一个惊喜是生成的动态库有一个.a
扩展名。不应该是 .so
(甚至是 `.dynlib)吗?
我的第二个惊喜是,当我生成带和不带CONFIG += staticlib
的库时,它总是生成相同的二进制文件(实际上,相同的大小,内容被报告为不同,但它可能只是SONAME 标签)。在所有其他平台上,静态和动态库二进制文件的大小始终不同。
我做错了什么吗?我实际上总是静态生成库吗(这将解释扩展总是 .a
),如果是这样,如何强制动态生成?
动态 .pro 文件:
#Generated by SDE CMake scripts!
CONFIG(release, debug|release) {
TARGET = tinyxml
}
CONFIG(debug, debug|release) {
TARGET = tinyxml-g
}
QT -= core
QT -= gui
CONFIG(debug, debug|release) {
DEFINES += _DEBUG
}
win32: DEFINES += TINYXML_EXPORTS
SOURCES += \
/Users/less/Documents/dev/vobs_ext/libcpp/tinyxml/src/tinystr.cpp \
/Users/less/Documents/dev/vobs_ext/libcpp/tinyxml/src/tinyxml.cpp \
/Users/less/Documents/dev/vobs_ext/libcpp/tinyxml/src/tinyxmlerror.cpp \
/Users/less/Documents/dev/vobs_ext/libcpp/tinyxml/src/tinyxmlparser.cpp
TEMPLATE = lib
INCLUDEPATH += \
/Users/less/Documents/dev/vobs_ext/libcpp/tinyxml/./tinyxml
静态 .pro 文件:
#Generated by SDE CMake scripts!
CONFIG(release, debug|release) {
TARGET = tinyxmls
}
CONFIG(debug, debug|release) {
TARGET = tinyxmls-g
}
QT -= core
QT -= gui
CONFIG(debug, debug|release) {
DEFINES += _DEBUG
}
win32: DEFINES += TINYXML_EXPORTS
QMAKE_CXXFLAGS += -DTINYXML_STATIC
SOURCES += \
/Users/less/Documents/dev/vobs_ext/libcpp/tinyxml/src/tinystr.cpp \
/Users/less/Documents/dev/vobs_ext/libcpp/tinyxml/src/tinyxml.cpp \
/Users/less/Documents/dev/vobs_ext/libcpp/tinyxml/src/tinyxmlerror.cpp \
/Users/less/Documents/dev/vobs_ext/libcpp/tinyxml/src/tinyxmlparser.cpp
TEMPLATE = lib
CONFIG += staticlib
INCLUDEPATH += \
/Users/less/Documents/dev/vobs_ext/libcpp/tinyxml/./tinyxml
知道了。
对于 windows 和 Android 目标,默认的库构建是动态的,所以除了 TEMPLATE += lib
之外,我从来不需要放置任何其他东西。在 Mac 上,默认情况下它是静态的。因此,要生成动态库 (.dylib),您必须通过添加 CONFIG += shared
.
这可以编译,但在部署时会崩溃。我在另一个线程上发布了这个:QtCreator for iOS: How to deploy a dylib shared library with my application