【发布时间】:2016-08-10 22:52:22
【问题描述】:
我正在尝试创建一个项目,它将创建一个可执行文件MyExec.exe,它依赖于另一个库Niftilib,它本身依赖于 zlib.
我所做的是我使用cmake并创建了一个superbuild,使用ExternalProject_Add下载和编译zlib:
ExternalProject_Add(Zlib
SOURCE_DIR "${PROJECT_BINARY_DIR}/deps/zlib"
BINARY_DIR "${PROJECT_BINARY_DIR}/deps/zlib-build"
INSTALL_DIR "${PROJECT_BINARY_DIR}/deps/zlib-install"
GIT_REPOSITORY "${git_protocol}://github.com/madler/zlib.git"
GIT_TAG "50893291621658f355bc5b4d450a8d06a563053d"
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
-DINSTALL_BIN_DIR=<INSTALL_DIR>/bin
-DINSTALL_INC_DIR=<INSTALL_DIR>/include
-DINSTALL_LIB_DIR=<INSTALL_DIR>/lib
-DINSTALL_MAN_DIR=<INSTALL_DIR>/share/man
-DINSTALL_PKGCONFIG_DIR=<INSTALL_DIR>/share/pkgconfig)
我为 Nifticlib 做了同样的事情:
ExternalProject_Add(Nifticlib
SOURCE_DIR "${PROJECT_BINARY_DIR}/deps/nifticlib"
BINARY_DIR "${PROJECT_BINARY_DIR}/deps/nifticlib-build"
INSTALL_DIR "${PROJECT_BINARY_DIR}/deps/nifticlib-install"
GIT_REPOSITORY "${git_protocol}://gitlab.com/slckr/nifticlib.git"
GIT_TAG "9f427b39eb6a16822c6ed34454f87eb751b23220"
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
-DZLIB_INCLUDE_DIR=${ZLIB_INC_DIR}
-DZLIB_LIBRARY_DEBUG=${ZLIB_LIB_DIR}/zlibd.lib
DEPENDS Zlib)
然后我为 MyExec 做了同样的事情:
ExternalProject_Add(MyExec
SOURCE_DIR "${PROJECT_BINARY_DIR}/MyExec"
BINARY_DIR "${PROJECT_BINARY_DIR}/MyExec-build"
INSTALL_DIR "${PROJECT_BINARY_DIR}/MyExec-install"
GIT_REPOSITORY "${git_protocol}://gitlab.com/slckr/MyExec.git"
GIT_TAG "8514aacf5422f1111602e24ea73b229556293b8c"
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
-DBOOST_INC_DIR=${Boost_INCLUDE_DIRS}
-DBOOST_LIB_DIR=${Boost_LIBRARY_DIRS}
-DZLIB_INC_DIR=${ZLIB_INC_DIR}
-DZLIB_LIB_DIR=${ZLIB_LIB_DIR}
-DNIFTI_INC_DIR=${NIFTI_INC_DIR}
-DNIFTI_LIB_DIR=${NIFTI_LIB_DIR}
DEPENDS Nifticlib)
在我的 MyExec 项目的 CMakeLists 中,我有这个:
cmake_minimum_required(VERSION 3.6)
project(MyExec)
include_directories(${BOOST_INC_DIR} ${ZLIB_INC_DIR} ${NIFTI_INC_DIR})
link_directories(${BOOST_LIB_DIR} ${ZLIB_LIB_DIR} ${NIFTI_LIB_DIR})
add_subdirectory(DataStructure)
add_subdirectory(FileHandler)
add_subdirectory(Parser)
add_executable(${PROJECT_NAME} MyExec.cc)
target_link_libraries(${PROJECT_NAME} zlibd znz nifticdf niftiio DataStructure FileHandler Parser)
install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin)
我的目标是能够分发 MyExec.exe 而无需拥有所有必需的库(boost 除外)。我希望将 nifticlib 库嵌入到我的 exec 中。
如果我以这种方式编译,它不起作用,因为它说 zlibd.dll 丢失了。我发现我必须将我的可执行文件链接到 zlibstaticd 而不是 zlibd。
但我的问题是,我是否也应该在 Nifticlib 项目中将 -DZLIB_LIBRARY_DEBUG=${ZLIB_LIB_DIR}/zlibd.lib 更改为 -DZLIB_LIBRARY_DEBUG=${ZLIB_LIB_DIR}/zlibstaticd.lib ?
还是只在可执行项目中重要?为什么 nifticlib 要求我提供 zlib 库的路径,如果它是作为静态库构建的并且不进行任何链接?
谢谢。
编辑:如果我没有将 zlib 链接到我的可执行文件,我会收到以下错误:
5>znz.lib(znzlib.obj) : error LNK2019: unresolved external symbol gzdopen referenced in function znzdopen
5>znz.lib(znzlib.obj) : error LNK2019: unresolved external symbol gzread referenced in function znzread
5>znz.lib(znzlib.obj) : error LNK2019: unresolved external symbol gzwrite referenced in function znzwrite
5>znz.lib(znzlib.obj) : error LNK2019: unresolved external symbol gzputs referenced in function znzputs
5>znz.lib(znzlib.obj) : error LNK2019: unresolved external symbol gzgets referenced in function znzgets
5>znz.lib(znzlib.obj) : error LNK2019: unresolved external symbol gzputc referenced in function znzputc
5>znz.lib(znzlib.obj) : error LNK2019: unresolved external symbol gzgetc referenced in function znzgetc
5>znz.lib(znzlib.obj) : error LNK2019: unresolved external symbol gzflush referenced in function znzflush
5>znz.lib(znzlib.obj) : error LNK2019: unresolved external symbol gzeof referenced in function znzeof
5>znz.lib(znzlib.obj) : error LNK2019: unresolved external symbol gzclose referenced in function Xznzclose
5>znz.lib(znzlib.obj) : error LNK2019: unresolved external symbol gzopen referenced in function znzopen
5>znz.lib(znzlib.obj) : error LNK2019: unresolved external symbol gzseek referenced in function znzseek
5>znz.lib(znzlib.obj) : error LNK2019: unresolved external symbol gztell referenced in function znztell
znz 是 nifticlib 的一部分。这是使用zlib库的部分。
编辑 2: 为了简单起见,我的问题是链接是否像链接 1 或链接 2 那样发生(知道 nifticlib 依赖于 zlib,都编译为静态库):
Linking 1 Linking 2
-------------- -------------- ---------------
| zlib | | zlib | | nifticlib |
-------------- -------------- ---------------
| \ /
-------------- \ /
| nifticlib | \ /
-------------- \ /
| -------------------
-------------- | MyExec.exe |
| MyExec.exe | -------------------
--------------
【问题讨论】:
-
如果我理解正确的话,Niftilib 依赖于 zlib 并且您希望将您的应用程序与 Niftilib 链接。比,不,这在 exec 中无关紧要。项目,但它在 Niftilib 库中很重要。以及。我不使用 CMake,但是,在 VS 中,当您创建一个依赖于另一个静态链接的静态链接时,您可以通过 Configuration Properties -> Librarian -> General -> Additional Dependencies 链接它(Niftilib 项目中的 zlib)。所以我认为,是的,你应该改变它并可能跳过 exec。项目。希望这有帮助;-)
-
我想如果我在 exec 中跳过它,MyExec 项目不会编译。它在链接步骤失败,因为它找不到符号。我的问题是,如果我编译依赖于 zlib 的 niftilib,zlib 符号是否会包含在 niftilib.lib 中?我还需要将它链接到 MyExec 吗?谢谢。
-
您是否尝试在 exec 中跳过它?如果你不直接从 exec 调用 zlib 函数,它应该只在 niftlib 中链接,不应该在 exec 中设置,我想是这样......不幸的是我不确定...... :-/ 试试看。
-
我试过了,还是不行。我收到了一些缺少符号的错误。
-
你能发布整个错误列表吗?
标签: c++ visual-studio static-libraries static-linking