我们的项目的结构如下。
1)MainApp,它通过使用boost动态加载dll,并且所有dll项目/模块都是使用/ MD构建的。
2)这些dll所需的任何其他项目都构建为静态(.lib)或动态(.dll)库。当这些依赖库是动态的时,没有问题,因为我可以使用相同的MD。但是,如果这些是静态的,则必须使用MD而不是默认的MT来构建它们,否则无法将其加载到这些dll中。
这一直有效,直到我尝试编译google cloud sdk c ++为止。
这是问题所在:Google cloud c ++ sdk具有google git附带的许多依赖项,但Google仅包含(或构建默认值)静态(/ MT)版本。而且他们甚至不提供更改为MD的选项。我可以使用cmake命令set(CMAKE_CXX_FLAGS_RELEASE "/MD")
将google cloud lib从/ MT更改为/ MD,但这不会建立,因为它的依赖项是/ MT。
简化的情况:
MainApp.exe动态加载-> Function.dll(/ MD),然后Function.dll静态链接Google_cloud.lib(.lib,但带有/ MD),然后Google_cloud.lib静态链接其依赖项(.lib,带有/ MT ,无法将其更改为/ MD)
所以我想唯一的选择是手动自定义使用/ MD构建Google Cloud的静态依赖项,然后使用/ MD将Google Cloud构建为静态,然后由我的function.dll加载为静态。
有什么建议吗?
答案 0 :(得分:0)
您可以更改BUILD_SHARED_LIBS
标志,这将使默认库类型成为共享库。
另一种方法就是将正确的参数传递给add_library
命令:
add_library(lib1 SHARED a.cpp b.cpp)
add_library(lib2 STATIC a.cpp b.cpp)
add_library(lib3 a.cpp b.cpp) # use the BUILD_SHARED_LIBS value