构建共享库,将头文件更新到编译器/系统目录

时间:2012-09-10 20:22:31

标签: linker shared-libraries qt-creator header-files

我和朋友正在使用Qt Creator和Boost来构建游戏引擎。到目前为止,我们已经认识到引擎将成为一个共享库,我们可以使用测试可执行文件运行它,这将成为我们最终想要制作的游戏。

问题是头文件,主要是。我想找到一些方法让Qt Creator能够在构建引擎的最新版本后立即识别头文件,或者甚至在添加它们时。起初我在思考Python中的一个脚本,它在构建引擎后作为Qt Creator中的构建步骤执行,只是将头文件复制到系统目录(例如/usr/include - 如果在*上运行) nix系统),IDE在将引擎与测试可执行文件链接时会识别头文件,我们也有完整的自动完成支持。

当然,会使用环境变量,虽然我更喜欢在Linux上开发,但我的朋友更喜欢Windows,所以我们同意根据各自的平台偏好来处理开发。

虽然这似乎是一个很好的解决方案,但我认为这个Python脚本的想法可能会过度杀戮。有更好的方法吗?

更新

从建议的Qmake脚本开始,我最终得到了这个错误。

cp -f "/home/amsterdam/Programming/atlas/Engine/AtlasEngine/"AtlasEngine_global.h "/" 
cp: cannot create regular file `/AtlasEngine_global.h': Permission denied
make: Leaving directory `/home/amsterdam/Programming/atlas/Engine/AtlasEngine__GCC__Linux__Debug'
make: *** [libAtlasEngine.so.1.0.0] Error 1
15:20:52: The process "/usr/bin/make" exited with code 2.
Error while building project AtlasEngine (target: Desktop)
When executing build step 'Make'

我的调整如下:

# Copy over build artifacts
SRCDIR = $$ATLAS_PROJ_ROOT
DESTDIR  = $$ATLAS_INCLUDE

# Look for header files there too
INCLUDEPATH += $$SRCDIR

# Dependencies: mylib. Only specify the libs you depend on.
# Leave out for building a shared library without dependencies.
#win32:LIBS += $$quote($$SRCDIR/mylib.dll)
# unix:LIBS += $$quote(-L$$SRCDIR) -lmylib

DDIR = \"$$SRCDIR/\" #<--DEFAULTS
SDIR = \"$$IN_PWD/\"

# Replace slashes in paths with backslashes for Windows

win32:file ~= s,/,\\,g
win32:DDIR ~= s,/,\\,g
win32:SDIR ~= s,/,\\,g

for(file, HEADERS) {
    QMAKE_POST_LINK += $$QMAKE_COPY $$quote($${SDIR}$${file}) $$quote($$DDIR) $$escape_expand(\\n\\t)
}

2 个答案:

答案 0 :(得分:1)

我已经设法使用一些跨平台工作的Qmake魔法来克服这个问题。它将共享库(.dll.so文件)与头文件一起复制到目前项目旁边的目录dll中的目录。

将它放在.pro文件的末尾,并相应地更改路径/库。

# Copy over build artifacts
MYDLLDIR = $$IN_PWD/../dlls
DESTDIR = \"$$MYDLLDIR\"

# Look for header files there too
INCLUDEPATH += $$MYDLLDIR

# Dependencies: mylib. Only specify the libs you depend on.
# Leave out for building a shared library without dependencies.
win32:LIBS += $$quote($$MYDLLDIR/mylib.dll)
 unix:LIBS += $$quote(-L$$MYDLLDIR) -lmylib

DDIR = \"$$MYDLLDIR/\"
SDIR = \"$$IN_PWD/\"
# Replace slashes in paths with backslashes for Windows
win32:file ~= s,/,\\,g
win32:DDIR ~= s,/,\\,g
win32:SDIR ~= s,/,\\,g
for(file, HEADERS) {
    QMAKE_POST_LINK += $$QMAKE_COPY $$quote($${SDIR}$${file}) $$quote($$DDIR) $$escape_expand(\\n\\t)
}

然后调整项目“运行设置”中的LD_LIBRARY_PATH以指向相同的dll目录(相对)。

是的,对于带有空格和反斜杠的路径进行转义很难看,但我发现这在跨平台上运行得很好。 Windows(XP,7)和Linux测试。是的,它包括要为运行项目而更改的环境设置,但至少您不再需要外部(Python)脚本,或者将其安装到需要root权限的系统目录中。

欢迎改进。

答案 1 :(得分:0)

我不确定是否有其他人会遇到此问题,但无论出于何种原因,Qmake无法正确访问我的用户指定环境变量。

所以,既然如此,我提出的一个解决方案是将变量添加为Qmake配置变量。

如果您使用的是基于UNIX的系统,那么您要做的第一件事就是将qmake的位置(应该位于QtSDK文件夹中)附加到您的系统$PATH,就像这样:

export PATH=$PATH:/path/to/QtSDK/...../qmake_root

从那里,你可以做一些事情:

qmake -set "VARIABLE" "VALUE"

在这种情况下,我只是做了:

qmake -set "ATLAS_PROJ_ROOT" $ATLAS_PROJ_ROOT

然后我在我的Qmake项目文件(.pro)中使用:

访问它

VAR = $$[ATLAS_PROJ_ROOT]

可以找到更多信息here