我有以下库lib_A, lib_B, lib_C, lib_D。我在我的 CMake 文件中做这样的事情(顺序很重要):
ADD_LIBRARY(lib_A)ADD_LIBRARY(lib_B)ADD_LIBRARY(lib_C)ADD_LIBRARY(lib_D)TARGET_LINK_LIBRARIES(lib_B lib_C)TARGET_LINK_LIBRARIES(lib_A lib_B)ADD_EXECUTABLE(Exec)TARGET_LINK_LIBRARIES(exec lib_A)TARGET_LINK_LIBRARIES(exec lib_D)这导致以下链接器命令。
linker -llib_A -llib_D -llib_B -llib_C
Run Code Online (Sandbox Code Playgroud)
一季度。为什么是lib_B和lib_C之后lib_D?
Q2。当我稍微更改 CMake 并执行以下操作时:
TARGET_LINK_LIBRARIES(lib_A lib_D)TARGET_LINK_LIBRARIES(exec lib_A)然后链接顺序是这样的:
linker -llib_A -llib_B -llib_C -llib_D
Run Code Online (Sandbox Code Playgroud)
这里lib_B和lib_C之前lib_D。这意味着target_link_libraries对于可执行目标和库目标的工作方式不同。我对吗?
这里的问题是,lib_B和lib_C还取决于lib_D,但我不想做target_link_libraries(lib_B lib_D)和target_link_libraries(lib_C lib_D),因为我有更多的这种情况下,我将不得不为每个库做手工。当然,在 Q2 中这样做可以解决问题,但是:
Q3 - 这个订单是由 CMake 以某种方式保证的还是只是偶然的?
谢谢
我在CMake中有一些调试信息,以检查我是否添加了编译项目所需的信息.这段代码很有效:
# Include DIRECTORIES
GET_PROPERTY(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
FOREACH(dir ${dirs})
MESSAGE(STATUS " * Include directory: '${dir}'")
ENDFOREACH()
Run Code Online (Sandbox Code Playgroud)
但是当我尝试检查当前项目中链接的所有库时,我得到一个空变量:
# Linking against
GET_PROPERTY(libtargets DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY LINK_LIBRARIES)
MESSAGE("Libs: ${libtargets}")
FOREACH(libtarget ${libtargets})
MESSAGE(STATUS " * Target Link library: '${libtarget}'")
ENDFOREACH()
Run Code Online (Sandbox Code Playgroud)
检查CMake文档3.0似乎没问题,但我不知道有哪些值可供阅读.我打印信息AFTER make ADD_LIBRARY/ADD_EXECUTABLE
LINK_LIBRARIES是否为GET_PROPERTY的值不正确?我怎么能得到这些信息?
我正在使用点云库 1.5.1。当我运行 CMake 3.4.0-rc2 来构建我的项目时,它有错误:
Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE)
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个错误?
我已经看到了如何使用双索引,但是还没有看到如何使用两行列标题。这可能吗?
例如,第1行是一系列重复的日期:2016、2016、2015、2015
第2行是一系列重复数据。美元销售额,单位销售额,美元销售额,单位销售额。
因此,每个“美元销售”标题实际上都与上一行中的日期相关。
随后的行是带有数据的单个项目。
有没有一种方法可以groupby使我拥有两个列标题?最终,我想按日期排列“美元销售”作为一个系列,以便可以绘制一个漂亮的图表。不幸的是,下一个“美元销售额”值之前有多个列。(不仅仅是一个“单位销售”列)。另外,如果我删除上面的日期行,则“日期销售”与每个日期之间都没有链接。
我正在尝试通过 CMake 在 Linux 上构建一个依赖于 Boost 的项目。该项目的 CMakeLists.txt 包含以下行:
find_package(Boost 1.46 REQUIRED COMPONENTS system thread filesystem)
Run Code Online (Sandbox Code Playgroud)
出于可重复性的原因,我已经通过安装了所需的 Boost 标头,conda install libboost以便它们位于
~/anaconda3/envs/.../include/boost而不是位于/usr/local/include. 不是当我运行时cmake,我收到如下错误:
CMake Warning at /usr/share/cmake-3.7/Modules/FindBoost.cmake:761 (message):
Imported targets not available for Boost version
Call Stack (most recent call first):
/usr/share/cmake-3.7/Modules/FindBoost.cmake:865 (_Boost_COMPONENT_DEPENDENCIES)
/usr/share/cmake-3.7/Modules/FindBoost.cmake:1470 (_Boost_MISSING_DEPENDENCIES)
cmake/Dependencies.cmake:5 (find_package)
CMakeLists.txt:43 (include)
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能让 CMake 找到我的 Boost 标头?
我在 Microsoft 网站上读到 SmtpClient 已过时,他们建议使用 MailKit 替换它。
我正在编写一个应用程序来使用 MailKit。
这是我到目前为止:
// *************** SEND EMAIL *******************
using (var client = new MailKit.Net.Smtp.SmtpClient())
{
//accept all SSL certificates
client.ServerCertificateValidationCallback = (s, c, h, e) => true;
client.Connect(emailSettings.SmtpServer, emailSettings.SmtpPort, emailSettings.IsSslEnabled);
if (emailSettings.IsAuthenticationRequired)
{
// Note: only needed if the SMTP server requires authentication
client.Authenticate(emailSettings.SmtpUsername, emailSettings.SmtpPassword);
}
// timeout = 20 seconds
client.Timeout = 20000;
client.Send(message);
client.Disconnect(true);
}
Run Code Online (Sandbox Code Playgroud)
当我设置这部分时:
client.Connect(emailSettings.SmtpServer, emailSettings.SmtpPort, emailSettings.IsSslEnabled);
Run Code Online (Sandbox Code Playgroud)
最后一个参数是bool useSSL,我将其设置为 true。我的电子邮件服务器由 Rackspace 托管,所以我知道它使用 SSL。当我将此选项设置为 true 时,它无法发送,但如果我将此选项设置为 false,则发送正常。
此行不应该捕获证书类型: …
我正在尝试编译并运行一个简单的 Cuda/thrust 程序,当扩展名是 时它可以工作,.cu但当源扩展名是.cpp. 我已经在 cmake 中应用了 cpp 文件所需的更改,但我得到了
错误:静态断言失败:此系统未实现 THRUST_STATIC_ASSERT_MSG
cmake_minimum_required(VERSION 3.12 FATAL_ERROR)
project(thrust_test LANGUAGES CXX CUDA)
find_package(CUDA 10.0 REQUIRED)
message(STATUS "CUDA ${CUDA_VERSION_STRING} at ${CUDA_TOOLKIT_ROOT_DIR}")
set(CUDA_LINK_LIBRARIES_KEYWORD PUBLIC)
include_directories(${CUDA_INCLUDE_DIRS})
link_directories(${CUDA_LIBRARY_DIRS})
set(CMAKE_CUDA_STANDARD 14)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
set(CUDA_SEPARABLE_COMPILATION ON)
set_source_files_properties(
main.cpp
PROPERTIES
CUDA_SOURCE_PROPERTY_FORMAT
OBJ)
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} ${CUDA_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)
和main.cpp:
__host__
__device__
int foo() {
// generate random data serially
thrust::host_vector<int> h_vec(100);
std::generate(h_vec.begin(), h_vec.end(), rand);
// transfer to device and compute sum
thrust::device_vector<int> d_vec = h_vec;
return thrust::reduce(d_vec.begin(), d_vec.end(), 0, …Run Code Online (Sandbox Code Playgroud) 这是我的代码:
#include <iostream>
#include <cmath>
int main() {
std::cout << std::sqrt(4) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
MAC操作系统10.15,CMake 3.15.4
只要包含头文件cmath.h,CMake编译就会出错。
执行命令:
cmake --build /Users/xxx/Documents/Playground/test1/cmake-build-debug --target test1 -- -j 4
Run Code Online (Sandbox Code Playgroud)
出现以下错误:
/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake --build /Users/xxx/Documents/Playground/test/cmake-build-debug --target test -- -j 4
Scanning dependencies of target test
[ 50%] Building CXX object CMakeFiles/test.dir/main.cpp.o
In file included from /Users/xxx/Documents/Playground/test/main.cpp:2:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:314:9: error: no member named 'signbit' in the global namespace
using ::signbit;
~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:315:9: error: no member named 'fpclassify' in the global namespace
using ::fpclassify;
~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:316:9: …Run Code Online (Sandbox Code Playgroud) 我正在尝试从 IDE 在 Visual Studio 2019 上使用 Ninja 构建项目。我想使用与 VS 2019 发行版中集成的版本不同的 CMake 版本。我已经cmakeExecutable在我的CMakeSettings.json文件中设置了变量指向我的 CMake 系统安装,并且使用 Visual Studio 生成器构建工作正常。但是,如果我使用 Ninja 作为生成器,Visual Studio 将使用 VS 集成版本的 CMake 回退。有没有办法使用 Ninja 和来自 IDE 的自定义 CMake 版本进行构建?
我正在做FRVT 1:1验证。所以我需要使用FRVT提供的程序。我已经连接到我写的程序,并完成了实现。但我想把我在cython写的东西一步步移植到NullImpFRVT提供的Example中。但我得到了这个结果:
nullimplfrvt11.cpp
....
#include <Python.h> //(is ok)
#include "numpy/arrayobject.h" //(error)
....
Run Code Online (Sandbox Code Playgroud)
CMakelists.txt
cmake_minimum_required(VERSION 2.8)
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
include_directories (${CMAKE_CURRENT_SOURCE_DIR}/../include ${CMAKE_CURRENT_SOURCE_DIR}/../../../common/src/include)
# Configure built shared libraries in top-level lib directory
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../../lib)
find_package(numpy REQUIRED)
find_package(PythonLibs REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})
target_link_libraries(${PYTHON_LIBRARIES})
# Build the shared libraries
add_library (frvt_11_null_001 SHARED nullimplfrvt11.cpp)
Run Code Online (Sandbox Code Playgroud)
输出:
[root@4d3eca5735a2 11]# bash run_validate_11.sh
Checking installation of required packages [SUCCESS]
Looking for core implementation library in /frvt/11/lib.[SUCCESS] Found core implementation library /frvt/11/lib/libfrvt_11_null_001.so.
Attempting to compile and link /frvt/11/lib/libfrvt_11_null_001.so …Run Code Online (Sandbox Code Playgroud)