小编Ste*_*ows的帖子

如何将-fvisibility选项应用于静态库中的符号?

我有一个共享库项目,它由4个静态库(.a)和一个object(.o)文件构成.我正在尝试添加-fvisibility=hidden选项以将输出中的符号限制为仅使用__attribute__在源中标记的符号.

我已经-fvisibility=hidden.so项目的编译选项(包括.o文件)和项目添加了选项.a.

目标文件中的符号将按照预期从最终中删除.so.但是,.a项目中的符号仍然在最终.so文件中.将-fvisibility=hidden选项添加到.solink命令无效.

我究竟做错了什么?

我的目的是从.so除了接口函数之外的所有符号中删除库.

编辑:我实际上使用版本地图来解决这个问题.但是,随着外部符号的更改,它需要继续维护版本脚本.接受的答案有更好的主意.

gcc visibility static-libraries

43
推荐指数
3
解决办法
3万
查看次数

Boost :: multi_array性能问题

我试图将boost :: multi_array的性能与本机动态分配的数组进行比较,使用以下测试程序:

#include <windows.h>
#define _SCL_SECURE_NO_WARNINGS
#define BOOST_DISABLE_ASSERTS 
#include <boost/multi_array.hpp>

int main(int argc, char* argv[])
{
    const int X_SIZE = 200;
    const int Y_SIZE = 200;
    const int ITERATIONS = 500;
    unsigned int startTime = 0;
    unsigned int endTime = 0;

    // Create the boost array
    typedef boost::multi_array<double, 2> ImageArrayType;
    ImageArrayType boostMatrix(boost::extents[X_SIZE][Y_SIZE]);

    // Create the native array
    double *nativeMatrix = new double [X_SIZE * Y_SIZE];

    //------------------Measure boost----------------------------------------------
    startTime = ::GetTickCount();
    for (int i = 0; i < ITERATIONS; ++i) …
Run Code Online (Sandbox Code Playgroud)

c++ performance boost boost-multi-array

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

从C++程序在Linux中运行另一个程序

好的,我的问题是这个.假设我有一个简单的C++代码:

#include <iostream>
using namespace std;

int main(){
   cout << "Hello World" << endl;
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在说我有这个程序,我想在我的程序中运行,称之为prog.在终端中运行此操作可以通过以下方式完成:

./prog
Run Code Online (Sandbox Code Playgroud)

有没有办法从我简单的C++程序中做到这一点?例如

#include <iostream>
using namespace std;

int main(){
   ./prog ??
   cout << "Hello World" << endl;
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

任何反馈都非常有必要.

c++ unix linux terminal

13
推荐指数
3
解决办法
3万
查看次数

Windows 7 Home Premium版本是否足以用于软件开发?

Windows 7 Home Premium是否足以用于软件开发?

开发将在Visual Studio 2010中进行.

我有预算,所以宁愿购买'Home Premium'而不是'Professional'或'Ultimate'.

微软的网站说,旁边没有的功能明智它们之间,开发商会想念有.任何人都可以确认或否认吗?

BTW.它是否带有IIS版本?

我意识到这不是一个技术问题.但这对我很重要,我相信其他开发者也会想到同样的事情.

干杯,

- 李

windows-7

11
推荐指数
3
解决办法
5225
查看次数

如何让QMake只有在更新时才能复制大数据文件

我有一些大型数据文件,需要在我们的Qmake/QtCreator构建期间从源文件夹复制到构建文件夹.由于它们很大,我只希望复制发生在新的/更改的文件中.我真的想避免将它们全部列在项目文件中.这是我尝试过的:

这种复制数据文件的尝试失败,因为DemoData文件夹是目标.因此,如果添加或更改文件夹中的文件,则不会执行复制.仅当文件夹不存在时.

DemoData.commands = $$COPY_CMD $${SRC_DATA_DIR}DemoData $${BLD_DATA_DIR}DemoData
DemoData.target += $${BLD_DATA_DIR}DemoData
PRE_TARGETDEPS += $${BLD_DATA_DIR}DemoData
QMAKE_EXTRA_TARGETS += DemoData
Run Code Online (Sandbox Code Playgroud)

此方法失败,因为DemoData.target项不应具有多个项的列表.QMake将列表放在生成的makefile中的引号中,使其成为一个目标.

DemoData.commands = $$COPY_CMD $${SRC_DATA_DIR}DemoData $${BLD_DATA_DIR}DemoData
DEMO_DATA_FILES = $$files($${SRC_DATA_DIR}DemoData/*)
for(FILE, DEMO_DATA_FILES){
    DemoData.target += $${BLD_DATA_DIR}DemoData\\$$basename(FILE)
    PRE_TARGETDEPS += $${BLD_DATA_DIR}DemoData\\$$basename(FILE)
}
QMAKE_EXTRA_TARGETS += DemoData
Run Code Online (Sandbox Code Playgroud)

此尝试失败,因为(AFAICT)QMake不支持其他变量中包含的变量名称.它似乎更像是一个级别的替代.生成一个makefile,但DemoDataX目标都没有命令行.所有显示"命令"字段内容的尝试都会产生语法错误.

DEMO_DATA_FILES = $$files($${SRC_DATA_DIR}DemoData/*)
DEMO_DATA_NAME = DemoData
for(FILE, DEMO_DATA_FILES){
    $${DEMO_DATA_NAME}.target = $${FILE}
    $${DEMO_DATA_NAME}.commands = $$COPY_CMD $${FILE} $${BLD_DATA_DIR}DemoData
    PRE_TARGETDEPS += $${FILE}
    QMAKE_EXTRA_TARGETS += $${DEMO_DATA_NAME}
    DEMO_DATA_NAME = $${DEMO_DATA_NAME}X
}
Run Code Online (Sandbox Code Playgroud)

这种方法有效,但有两个缺点.次要的是必须执行单独的"make install"步骤.主要的一点是始终无条件地复制文件.由于我们的数据文件很大,这在时间上是不可接受的.

DemoData.path = $${BLD_DATA_DIR}DemoData
DemoData.files = $${SRC_DATA_DIR}DemoData/*
INSTALLS += DemoData
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点,还是我留下了某种外部脚本或手动生成/维护的makefile?

qmake qt-creator

7
推荐指数
1
解决办法
1538
查看次数

如果调用cudaMalloc,则不会退出简单的控制台程序

如果执行cudaMalloc调用,则以下简单程序永不退出.只注释cudaMalloc会导致它正常退出.

#include <iostream>
using std::cout;
using std::cin;

#include "cuda.h"
#include "cutil_inline.h"

void PrintCudaVersion(int version, const char *name)
{
    int versionMaj = version / 1000;
    int versionMin = (version - (versionMaj * 1000)) / 10;
    cout << "CUDA " << name << " version: " << versionMaj << "." << versionMin << "\n";
}

void ReportCudaVersions()
{
    int version = 0;
    cudaDriverGetVersion(&version);
    PrintCudaVersion(version, "Driver");

    cudaRuntimeGetVersion(&version);
    PrintCudaVersion(version, "Runtime");
}

int main(int argc, char **argv)
{
    //CUresult r = cuInit(0);                 << These two …
Run Code Online (Sandbox Code Playgroud)

c++ windows cuda

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

为什么*=关于转换数据丢失的不同?

我有以下示例,在VS2005中编译,警告级别4:

int main(int argc, char *argv[])
{
    short s = 2;
    short t = 3;

    t *= s;    // warning C4244: '*=' : conversion from 'int' to 'short', possible loss of data
    t = t * s;
}
Run Code Online (Sandbox Code Playgroud)

在我看来,任何一条线都不应该有警告.

由于某种原因,*=是否创建了对int的隐式转换?

编辑:

似乎第二行(以及在VS2008中)缺少警告是真正的问题.

谢谢你的回答.

c++

5
推荐指数
1
解决办法
1240
查看次数

为什么QtCreator/MSVC将64位系统DLL链接到我的32位应用程序?

更新:这基本上都是虚假的.事实证明,运行应用程序的机器上的Depends.exe版本是32位版本.修复后,两台机器都将系统DLL显示为64位,因此这不是问题的根源.不确定为什么依赖在32位exe中以这种方式显示它们.


进一步更新:最终问题是一个64位DLL.使用正确版本的Dependency Walker后,这更容易找到.选择32对64位版本并不基于您运行的平台.来自FAQ:

Dependency Walker适用于任何32位或64位Windows模块.有32位和64位版本的Dependency Walker.所有版本都支持或打开32位和64位模块.但是,使用32位Dependency Walker处理32位模块和使用64位Dependency Walker处理64位模块有很大的优势.在64位版本的Windows上运行时尤其如此,它允许执行32位和64位程序.64位Windows上的32位子系统(称为"WOW64")具有自己的私有注册表,"AppPaths","KnownDlls",系统文件夹和清单处理.只有32位版本的Dependency Walker才能访问这个32位环境,这是准确处理32位模块所必需的.同样,


我有一个应用程序可以在一台机器上正确构建而在另一台机器上不正确.两者都是通过BootCamp运行Windows 7的MacBook Pro.它们是通过QtCreator构建的,VS2010是编译/链接工具.

在机器A上,它编译和链接没有任何报告的错误.但是,运行时失败并出现0xc000007b错误(STATUS_INVALID_IMAGE_FORMAT).Depends.exe确认exe是32位exe,但所有Windows DLL(advapi32.dll等)都链接为64位DLL.似乎这将是链接时间错误,但显然不是.

在机器B上,一切都编译并正确运行.Depends.exe确认exe和所有链接的DLL都是32位.

我的Qt项目配置如下:

qmake: qmake.exe PROJECT.pro -r -spec win32-msvc2010 "CONFIG+=declarative_debug"
Run Code Online (Sandbox Code Playgroud)

我相信该-spec win32-msvc2010部分足以指定32位构建.

项目文件显式链接到位于以下位置的Windows导入lib文件: C:/ Program Files(x86)/ Microsoft SDKs/Windows/v7.0A/Lib 我已经确认这些是32位导入库.项目文件中的显式LIB + =行调用此路径.如果从项目文件中删除此行,则链接仍会成功.所以我不确定在这种情况下如何指定Windows系统导入库的位置.

我用dumpbin验证了导入.libs被标记为32位或64位.我们使用32个import libs指定位置.

因为一台机器工作而另一台机器不工作,我认为问题是机器配置问题.因此,我从机器A中删除并重新安装了MS工具:

  • 卸载了VS2010,Windows 8 SDK,.NET Framework 4.5,QT库和QtCreator.
  • 按以下顺序重新安装以上所有内容:

    1. VS2010
    2. VS2010 SP1
    3. .NET Framework 4.5
    4. Windows 8 SDK
    5. Qt图书馆4.8.4
    6. QtCreator 2.7.1

我仍然得到一个32位exe链接到64位DLL.

什么可能导致奇怪的链接?和/或如何更准确地确定它认为它应该链接到64位DLL的原因?

windows qmake qt-creator 32bit-64bit visual-c++

5
推荐指数
1
解决办法
1168
查看次数

com.mongodb.MongoTimeoutException 使用带有列表 ServerAddress 的 MongoClient 时

我正在尝试将副本数据库部署到具有不同端口的一台服务器上并与之连接。如果我只使用单个 ServerAddress 并像这样直接连接到主数据库,则一切正常:

mongoClient =new MongoClient(new ServerAddress("104.236.106.53", 27000));
morphia = new Morphia();
ds = morphia.createDatastore(mongoClient, "morphiaDB");
Run Code Online (Sandbox Code Playgroud)

一切正常。但是当我尝试这样使用时List<ServerAddress>

List<ServerAddress> lstServer = new ArrayList<ServerAddress>();
lstServer.add(new ServerAddress("104.236.106.53", 27000));
lstServer.add(new ServerAddress("104.236.106.53", 27002));
lstServer.add(new ServerAddress("104.236.106.53", 27001));
mongoClient = new MongoClient(lstServer);
morphia = new Morphia();
ds = morphia.createDatastore(mongoClient, "morphiaDB");
Run Code Online (Sandbox Code Playgroud)

最终会出现这个错误:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Exception in thread "main" com.mongodb.MongoTimeoutException: Timed out after 10000 ms while waiting for a server …
Run Code Online (Sandbox Code Playgroud)

java timeout mongodb mongodb-java

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

工作程序在"清洁机器"上出现非法指令错误?

我有一个程序在我的开发机器上正常工作但在"干净机器"上进行测试时会产生非法指令错误,其中只有必要的文件被复制.

该程序包含我的共享库,它是从C++源代码构建的,以及一个演示库使用情况的C包装器示例程序.在开发机器上,所有都是用Eclipse w/g ++构建的,Debug和Release都可以正常工作.链接了许多标准库.

为了测试我可能错过的依赖项,我将.c文件,我的库的.so文件和库.h文件复制到新的Linux安装中,并使用Eclipse创建的简单脚本编译/链接它们.正在使用.两台机器都有g ++ 4.3.2.

当我在干净的机器上运行程序时,它会在打印"非法指令"后立即退出.

在gdb中运行会产生:

(gdb) run
Starting program: /home/sfallows/Source/Apps/MySample/MySample 
[Thread debugging using libthread_db enabled]
[New Thread 0xb5c4ca90 (LWP 7063)]

Program received signal SIGILL, Illegal instruction.
[Switching to Thread 0xb5c4ca90 (LWP 7063)]
0xb7f0cb29 in __static_initialization_and_destruction_0 (__initialize_p=1, __priority=65535) at /usr/include/c++/4.3/iostream:77
77   static ios_base::Init __ioinit;
Current language:  auto; currently c++
(gdb) bt
#0  0xb7f0cb29 in __static_initialization_and_destruction_0 (__initialize_p=1, __priority=65535) at /usr/include/c++/4.3/iostream:77
#1  0xb7f0cb48 in global constructors keyed to _ZN8NodeLockC2Ev () at ../NodeLock.cpp:194
#2  0xb7f204ad in __do_global_ctors_aux () from /home/sfallows/Source/Apps/MySample/libMyLib.so …
Run Code Online (Sandbox Code Playgroud)

c++ linux gdb g++

4
推荐指数
1
解决办法
5434
查看次数