在网上四处看看我看到了很多这样的代码:
include(FindPkgConfig)
pkg_search_module(SDL2 REQUIRED sdl2)
target_include_directories(app SYSTEM PUBLIC ${SDL2_INCLUDE_DIRS}
target_link_libraries(app ${SDL2_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)
然而,这似乎是错误的方式,因为它只使用包含目录和库,但忽略了定义,库路径和可能返回的其他标志pkg-config.
这样做的正确方法是什么,并确保编译后pkg-config使用的所有编译和链接标志都被使用app?是否有一个命令来实现这一点,即类似的东西target_use(app SDL2)?
我在Windows SDK和NMake Makefiles上使用CMake.
默认情况下,它使用/MD编译器开关进行编译.
如何更改它以使用/MT开关编译?
我知道如何使用以下代码打印"所有"全局变量
for k,v in pairs(_G) do
print("Global key", k, "value", v)
end
Run Code Online (Sandbox Code Playgroud)
所以我的问题是如何为当前正在执行的函数可访问的所有变量执行此操作,这可以locals()为Python 做什么.
假设我有一个名为Foo的包.如果我在包含的CMakeLists.txt文件上运行CMake find_package(Foo),那么我可以打印出变量的值,例如${Foo_LIBRARIES}和${Foo_INCLUDES}.
是否有一种简单的方法来显示这些变量而无需在CMakeLists.txt文件上运行CMake,而无需手动检查config.cmake文件?
在Qt 4项目中,我使用Inno Setup构建了一个Windows安装程序.所需的库(qsqlite.dll,qjpeg4.dll等)包含在脚本中,带有CMake变量,如QT_QSQLITE_PLUGIN_RELEASE或QT_QJPEG_PLUGIN_RELEASE.
例如:setup.iss.in:
[Files]
Source: "myapp.exe"; DestDir: {app}
Source: "${QT_QSQLITE_PLUGIN_RELEASE}"; DestDir: {app}/sqldrivers
Source: "${QT_QJPEG_PLUGIN_RELEASE}"; DestDir: {app}/imageformats
Run Code Online (Sandbox Code Playgroud)
现在项目应该迁移到Qt5.一切正常,但我找不到预先定义的变量来获得这些插件路径的Qt5等价物.当然,我可以对它们进行硬编码,但我正在寻找一种以干净和独立的方式定义它的方法.
我创建了一个包含大量link_directories()命令的项目.我现在想将结果的目录字符串存储到变量中.对于include_directories(),这很容易使用
get_property( test_INCLUDE_DIRECTORIES TARGET test PROPERTY INCLUDE_DIRECTORIES )
Run Code Online (Sandbox Code Playgroud)
但是似乎没有LINK_DIRECTORIES属性可以做
get_property( test_LINK_DIRECTORIES TARGET test PROPERTY LINK_DIRECTORIES )
Run Code Online (Sandbox Code Playgroud)
有没有办法获得用于目标的链接目录列表?
(注意:我意识到我可以自己手动跟踪变量中的链接目录然后使用单个link_directories()但它看起来不是很干净)
我想在我的Android NDK项目中使用分解声明。因此clang需要用调用-std=c++17。目前,我的代码可以正确编译,但是Clang打印以下警告:
warning: decomposition declarations are a C++17 extension [-Wc++17-extensions]
Run Code Online (Sandbox Code Playgroud)
在构建日志中,我发现它-std=...四次附加到构建标志:
[...]/bin/clang++ [...] -Wformat -Werror=format-security -std=c++11 -std=c++1z\
-fexceptions -std=c++1z -Wall -O0 -fno-limit-debug-info -fPIC\
-std=gnu++11 -MD -MT [...]
Run Code Online (Sandbox Code Playgroud)
我知道第二个和第三个标志来自哪里(见下文)。我试图将它们更改为-std=c++17,-std=c++1z但没有成功。
我猜以后的标记会覆盖以前的标记。所以我真的不在乎第一个。但是我不知道最后一个(-std=gnu++11)的来源以及如何停用或修改它。我也猜想它gnu++11不是c++11激活某些GNU扩展,导致我只得到警告而没有错误的情况。
但是我不能确定。不过,我想要“真正的” C ++ 17支持,而不仅仅是一些GNU扩展。我也想摆脱警告。
gradle.buildcppFlags此处的切换是上述构建日志摘录中第二个标志的来源。我知道这里的某些版本已过时。但是我是从NDK示例存储库中获得的,而且我是Android编程的新手。我还在弄清楚事情是如何进行的。所以我现在还不在乎那部分。
apply plugin: 'com.android.application'
android {
compileSdkVersion = 25
defaultConfig {
applicationId = 'com.example.stackoverflow'
minSdkVersion 14
targetSdkVersion 25
externalNativeBuild {
cmake {
arguments '-DANDROID_STL=c++_static'
cppFlags …Run Code Online (Sandbox Code Playgroud) cmake ×6
android ×1
android-ndk ×1
c++17 ×1
clang++ ×1
dll ×1
lua ×1
pkg-config ×1
plugins ×1
qt5 ×1