小编dus*_*der的帖子

如何在CMake的try_compile函数中为OpenMP设置链接器标志

我想验证当前编译器是否可以使用openmp支持构建.该应用程序已经部署在各种各样的unix系统上,其中一些可能有旧版本的OpenMP,我想测试重要的OpenMP功能.所以,我想构建一个包含一些OpenMP调用的测试源文件.

因此,我创建了一个非常简单的测试文件,并尝试使用CMake的try_compile函数.遗憾的是,它似乎没有正确应用-fopenmp链接器标志.有谁知道如何强制链接器标志或查看链接器标志是否被应用于任何地方?

来自CMakeLists.txt

try_compile(
    HAVE_OPENMP
    ${APBS_ROOT}/src/config
    ${APBS_ROOT}/src/config/omp_test.c
    CMAKE_FLAGS "-DCMAKE_C_FLAGS=-fopenmp -DCMAKE_EXE_LINKER_FLAGS=-fopenmp"
    OUTPUT_VARIABLE TRY_COMPILE_OUTPUT
    )
Run Code Online (Sandbox Code Playgroud)

来自omp_test.c

#include <stdio.h>
#include <omp.h>

int main()
{
    int i;
    int threadID = 0;
    #pragma omp parallel for private(i, threadID)
    for(i = 0; i < 16; i++ )
    {
        threadID = omp_get_thread_num();
        #pragma omp critical
        {
            printf("Thread %d reporting\n", threadID);
        }
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果输出是

Change Dir: src/config/CMakeFiles/CMakeTmp

Run Build Command:/usr/bin/make "cmTryCompileExec/fast"
/usr/bin/make -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build
make[1]: Entering directory `src/config/CMakeFiles/CMakeTmp'
/usr/bin/cmake -E cmake_progress_report /data/work/source/apbs/src/config/CMakeFiles/CMakeTmp/CMakeFiles 1
Building …
Run Code Online (Sandbox Code Playgroud)

cmake openmp

48
推荐指数
4
解决办法
5万
查看次数

共享库的CMake和顺序依赖链接

我有几个小组件,我正在构建为我的主应用程序的共享库.允许使用的一个例子libalibb.每个都在它们自己的子目录中构建,如下所示:

add_library(liba SHARED a.cpp)
Run Code Online (Sandbox Code Playgroud)

然后,在根项目文件夹中,我需要将我的主应用程序链接到两者.

include_directories(a)
include_directories(b)
add_executable(dummy dummy.cpp)
target_link_libraries(dummy a b)
Run Code Online (Sandbox Code Playgroud)

CMake运行正常,我的应用程序编译但无法链接.问题是b引用了a.如果我在链接时提供库的顺序

target_link_libraries(dummy b a)
Run Code Online (Sandbox Code Playgroud)

该程序编译和链接就好了

当这种系统开始涉及更复杂的库之间的依赖关系时,即使依赖关系是非循环的,它也开始变得不可能.如何在此管理链接步骤?在CMake中订购库以进行链接是否有诀窍?

c++ cmake dynamic-linking

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

当.h文件清晰可用时,为什么autoconf不通过AC_CHECK_HEADER测试?

我有一段时间让autoconf检查是否存在特定的头文件.

让我们调用头依赖项"inky.h",让我们说inky是一个安装(单独),前缀设置为"/ usr/local"的库.这将"inky.h"放在/usr/local/inky/inky.h中,将libinky.so放在/ usr/local/lib中.

现在,我正在尝试在我的应用程序configure.ac中验证inky.h的存在,如下所示:

dnl # Setup temp LDFLAGS and look for inky library/header
LDFLAGS_SAVE=${LDFLAGS};
CPPFLAGS_SAVE=${CPPFLAGS};

dnl # Look for inky on the user specified inky install path
LDFLAGS ="-L${inky_library_path}";
CPPFLAGS="-I${inky_include_path}/inky";

AC_MSG_NOTICE([Looking for inky.h using: ${CPPFLAGS}]);

dnl # This check finds inky.h just fine.  This check was only used for debugging
AC_CHECK_FILE(
   [${inky_include_path}/inky/inky.h],
   [AC_MSG_NOTICE([Found inky.h])],
   [AC_MSG_NOTICE([Didn't find inky.h])]
   )

dnl # Look for the inky header file.  If it isn't found, terminate.
AC_CHECK_HEADER(inky.h,
    [],
    [AC_MSG_ERROR([Couldn't find or include inky.h])] …
Run Code Online (Sandbox Code Playgroud)

c autoconf

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

如何在 Google Apps 脚本中缓存对象

我正在 Google Drive 电子表格的脚本中从 JIRA 获取 JSON 数据。我有一个脚本可以很好地进行提取,而且我几乎只为该问题提取数据。我得到的是 JSON 文本字段,表示有关该特定 JIRA 问题的所有数据。

不是每次我想要来自特定 JIRA 问题的字段时都调用 UrlFetch 服务,而是想在第一次获取后缓存获取的 JSON 数据。

不幸的是,Google 的 Google Apps 脚本缓存服务只会缓存字符串格式的数据,并将字符串限制为 200 个字符。JIRA 返回的 JSON 文本数据远远超过 200 个字符。

是否有其他方法可以缓存 javascript 对象(如解析的 JSON 字符串)或在 Google Apps 脚本中缓存 200 多个字符的方法?

这是我在意识到数据存储为字符串之前尝试缓存数据的代码:

function _fetchJiraData(targetIssue) {
  Logger.log("Started fetching JIRA data for '%s'", targetIssue);

  var data = cache.get(targetIssue);
  if (data == null) {
    var options = {
      headers : {
        Authorization : "Basic " + Utilities.base64Encode('user:password')
      }
    };
    var url = Utilities.formatString( …
Run Code Online (Sandbox Code Playgroud)

google-apps-script

8
推荐指数
1
解决办法
6721
查看次数

如何使用CMake正确检查功能

在从automake转换为cmake时,我必须对函数存在进行一些测试.我没有编写configure.ac脚本,但我必须尽可能地重现这些功能,所以请不要因为这些检查而责备我.我必须制作它们.

所以,我正在尝试使用CheckFunctionExists模块来检查时间函数的存在(以及其他).这是cmake代码

include(CheckIncludeFiles)

CHECK_FUNCTION_EXISTS(time, HAVE_TIME_FUNCTION)

if(NOT HAVE_TIME_FUNCTION)
    message(FATAL_ERROR "ERROR: required time function not found")
endif(NOT HAVE_TIME_FUNCTION)
Run Code Online (Sandbox Code Playgroud)

每次都失败,尽管我知道我有时间功能(duh).我尝试用printf替换时间,但仍然失败.我是否需要进行一些设置才能使此检查正常工作?

cmake

7
推荐指数
2
解决办法
2939
查看次数

如何为qt项目设置安装路径

我正在寻找相当于./configure --prefix = for qmake.基本上,我想覆盖默认的安装/部署目录.如何使用命令行qmake指定?我还使用QtCreator构建了很多我的gui项目,并且我想知道如何在QtCreator内部构建时做同样的事情.是否有可以在.pro文件中操作的变量来执行此操作,还是更改项目设置?

谢谢!

qt qt-creator

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

CMake和处理子文件夹头文件

我正在尝试设置我的项目来构建包含其完整功能的多个动态库.每个库都有子文件夹.子文件夹库彼此依赖,因此它们必须相互引用函数.我似乎已经设法让CMake在项目中没有错误地运行,但是当我去构建时,我的头部找到了彼此的麻烦.似乎在构建时,包含路径未正确设置.我怎样才能解决这个问题?我是否需要采取其他步骤才能正确设置包含路径?

结构看起来像这样

root
    CMakeLists.txt
    bin
    lib
    lib0
        CMakeLists.txt
        lib0.h
        lib0.cpp
    lib1
        CMakeLists.txt
        lib1.h
        lib1.cpp
    ...
Run Code Online (Sandbox Code Playgroud)

在根目录的CMakeLists.txt中,我有这样的声明:

set(ROOT /blah/blah/root)    

include_directories(${ROOT}/lib0)
include_directories(${ROOT}/lib1)

add_subdirectory(lib0)
add_subdirectory(lib1)
Run Code Online (Sandbox Code Playgroud)

在子文件夹的CMakeLists.txt中,我有:

set(lib0_SOURCES "")
list(APPEND lib0_SOURCES lib0.cpp)
add_library(lib0_lib ${lib0_SOURCES})
Run Code Online (Sandbox Code Playgroud)

我的库标题看起来像(假设这是lib0.h):

#include "lib1/lib1.h"
...
Run Code Online (Sandbox Code Playgroud)

CMake运行良好,没有错误,但是当我去编译时,我得到一个错误,如:

In file included from /blah/blah/root/lib0/lib0.cpp:1:0:
/blah/blah/root/lib0/lib0.h:1:30: fatal error: lib1/lib1.h: No such file or directory
Run Code Online (Sandbox Code Playgroud)

c++ cmake

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

ZeroMQ正在吃我的数据....但有时只是

所以,我正在探索0MQ作为我的集群应用程序的消息传递协议.它提供了我需要的那种异步通信.

到目前为止,我已经初步成功制作了一个原型.我能够使用几种不同类型的模式发送和接收消息.

我目前正试图PUB/SUB通过REP/REQ"握手" 获得一个初始同步模式.ZeroMQ指南在"节点协调"下描述了这种方法.而且该方法效果很好.唯一的问题是0MQ似乎正在吃掉约50%的信息,或者至少是其中的数据.

我正在使用Qt,因此消息包含一个QString.我将字符串打包成a QByteArray使用a QDataStream.然后,我通过QByteArray"电线"并在另一侧打开包装.我经常使用这种方法通过其他协议(如tcp套接字)进行通信,并且效果很好.

我有4个"工人"连接到via PUB/SUBREQ/REP一个"经理".在大多数运行中,至少1个,最多3个"工人"同步很好.但是,当他们不这样做时,他们会收到一个空字符串.

这是4个客户的日志:

alicia:

[09:18:15.337] [Info] Logging initialized
[09:18:15.337] [Debug] Initializing client 
                       alicia
[09:18:15.337] [Debug] Attempting to receive START signal from server
[09:18:15.340] [Info] Received message: 
                      START
[    09:18:15.341] [Debug] Recieved a SYNC message
                       SYNC
[09:18:15.341] [Info] Received START signal from manager
[09:18:15.341] [Info] Received message: 
                      2
Run Code Online (Sandbox Code Playgroud)

brenda:

[09:18:15.337] [Info] Logging initialized
[09:18:15.337] [Debug] Initializing client 
                       brenda
[09:18:15.337] …
Run Code Online (Sandbox Code Playgroud)

qt zeromq

3
推荐指数
1
解决办法
3233
查看次数