小编squ*_*les的帖子

CMake 库链接顺序

我有以下库lib_A, lib_B, lib_C, lib_D。我在我的 CMake 文件中做这样的事情(顺序很重要):

  1. ADD_LIBRARY(lib_A)
  2. ADD_LIBRARY(lib_B)
  3. ADD_LIBRARY(lib_C)
  4. ADD_LIBRARY(lib_D)
  5. TARGET_LINK_LIBRARIES(lib_B lib_C)
  6. TARGET_LINK_LIBRARIES(lib_A lib_B)
  7. ADD_EXECUTABLE(Exec)
  8. TARGET_LINK_LIBRARIES(exec lib_A)
  9. TARGET_LINK_LIBRARIES(exec lib_D)

这导致以下链接器命令。

linker -llib_A -llib_D -llib_B -llib_C
Run Code Online (Sandbox Code Playgroud)

一季度。为什么是lib_Blib_C之后lib_D

Q2。当我稍微更改 CMake 并执行以下操作时:

  1. TARGET_LINK_LIBRARIES(lib_A lib_D)
  2. TARGET_LINK_LIBRARIES(exec lib_A)

然后链接顺序是这样的:

linker -llib_A -llib_B -llib_C -llib_D
Run Code Online (Sandbox Code Playgroud)

这里lib_Blib_C之前lib_D。这意味着target_link_libraries对于可执行目标和库目标的工作方式不同。我对吗?

这里的问题是,lib_Blib_C还取决于lib_D,但我不想做target_link_libraries(lib_B lib_D)target_link_libraries(lib_C lib_D),因为我有更多的这种情况下,我将不得不为每个库做手工。当然,在 Q2 中这样做可以解决问题,但是:

Q3 - 这个订单是由 CMake 以某种方式保证的还是只是偶然的?

谢谢

gcc cmake

6
推荐指数
1
解决办法
9562
查看次数

当尝试获取Target Link Libraries信息时,获取属性返回空变量

我在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的值不正确?我怎么能得到这些信息?

c++ cmake

6
推荐指数
1
解决办法
289
查看次数

错误:找不到 PkgConfig(缺少:PKG_CONFIG_EXECUTABLE)

我正在使用点云库 1.5.1。当我运行 CMake 3.4.0-rc2 来构建我的项目时,它有错误:

Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE)
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个错误?

pkg-config cmake point-cloud-library

6
推荐指数
2
解决办法
1万
查看次数

Python Pandas,两行作为列标题?

我已经看到了如何使用双索引,但是还没有看到如何使用两行列标题。这可能吗?

例如,第1行是一系列重复的日期:2016、2016、2015、2015

第2行是一系列重复数据。美元销售额,单位销售额,美元销售额,单位销售额。

因此,每个“美元销售”标题实际上都与上一行中的日期相关。

随后的行是带有数据的单个项目。

有没有一种方法可以groupby使我拥有两个列标题?最终,我想按日期排列“美元销售”作为一个系列,以便可以绘制一个漂亮的图表。不幸的是,下一个“美元销售额”值之前有多个列。(不仅仅是一个“单位销售”列)。另外,如果我删除上面的日期行,则“日期销售”与每个日期之间都没有链接。

python-3.x pandas

6
推荐指数
1
解决办法
7819
查看次数

使 cmake 的 find_package(Boost ...) 在 conda 环境中查找标头

我正在尝试通过 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 标头?

boost cmake anaconda

6
推荐指数
1
解决办法
4209
查看次数

什么时候需要在 MailKit 上启用 SSL

我在 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,则发送正常。

此行不应该捕获证书类型: …

c# mailkit

6
推荐指数
1
解决办法
2973
查看次数

在 cpp 文件中使用时推力静态断言

我正在尝试编译并运行一个简单的 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)

c++ cuda cmake thrust

6
推荐指数
1
解决办法
4050
查看次数

包含 cmath 标头时 Cmake 编译错误

这是我的代码:

#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)

c++ xcode cmake clion

6
推荐指数
1
解决办法
2955
查看次数

如何使用自定义 CMake 版本执行 Visual Studio 2019 Ninja 构建?

我正在尝试从 IDE 在 Visual Studio 2019 上使用 Ninja 构建项目。我想使用与 VS 2019 发行版中集成的版本不同的 CMake 版本。我已经cmakeExecutable在我的CMakeSettings.json文件中设置了变量指向我的 CMake 系统安装,并且使用 Visual Studio 生成器构建工作正常。但是,如果我使用 Ninja 作为生成器,Visual Studio 将使用 VS 集成版本的 CMake 回退。有没有办法使用 Ninja 和来自 IDE 的自定义 CMake 版本进行构建?

cmake ninja visual-studio-2019

6
推荐指数
0
解决办法
913
查看次数

如何使用 CMake 链接“numpy/arrayobject.h”

我正在做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)

c++ linker cmake undefined-reference

6
推荐指数
1
解决办法
4663
查看次数