相关疑难解决方法(0)

带-std = c99的GCC抱怨不知道struct timespec

当我尝试在Linux上编译它时gcc -std=c99,编译器抱怨不知道struct timespec.但是,如果我编译它没有-std=c99一切正常.

#include <time.h>

int main(void)
{
  struct timespec asdf;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样,有没有办法让它继续使用-std=c99

c posix c99 timespec

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

Linux上的链接器错误:"未定义引用"

我可以毫无问题地创建一个共享库.我创建libcbitcoin.so(没有错误)并尝试使用可执行文件和OpenSSL库链接它.我用这个命令:

gcc -L/media/sf_BitEagle_Projects/cbitcoin/build/bin -lcbitcoin \
-Wl-rpath,/media/sf_BitEagle_Projects/cbitcoin/build/bin -lssl -lcrypto \
-L/usr/local/ssl/lib/ -o /media/sf_BitEagle_Projects/cbitcoin/build/bin/testCBAddress \
/media/sf_BitEagle_Projects/cbitcoin/build/obj/testCBAddress.o \
/media/sf_BitEagle_Projects/cbitcoin/build/obj/CBOpenSSLCrypto.o
Run Code Online (Sandbox Code Playgroud)

bin目录是库的位置.obj目录包含我希望链接到可执行文件的目标文件.在命令中我使用-L,-l和-rpath选项,我认为这些选项只需要在linux中进行链接.看来我错了,因为我得到的错误如下:

/media/sf_BitEagle_Projects/cbitcoin/test/testCBAddress.c:40:
undefined reference to `CBNewByteArrayFromString'
Run Code Online (Sandbox Code Playgroud)

CBNewByteArrayFromString可在库中找到.由于某种原因,它没有被联系起来.OpenSSL也是:

/media/sf_BitEagle_Projects/cbitcoin/dependencies/crypto/CBOpenSSLCrypto.c:37:
undefined reference to `SHA1'
Run Code Online (Sandbox Code Playgroud)

如何使链接起作用?

GCC版本:gcc(Ubuntu/Linaro 4.6.3-1ubuntu5)4.6.3

在Linux Mint 13上

谢谢.

linux linker gcc build

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

调用者程序对库类成员错误的未定义引用

其他问题在下面添加,2011年4月11日

我正在用C++开发一个跨平台的共享库DLL/Sos和测试程序集,虽然我必须能够支持C.这些库将仅作为目标代码发布,但测试程序将附带源代码我们的客户可以拥有示例代码.出于这个原因,我正在设计要在运行时加载的库,即使用dlopen()/ LoadLibraryA()进行动态链接.

我在Umbutu 10.04上使用g ++ 4.4.3-4,在Vista/64上使用VC++ 2008(在32位模式下).

一切似乎在Windows上运行得很好(现在).但是,当我在Linux上编译时,我遇到了一些我无法弄清楚的错误.

测试器和库有几个类,分别用.cpp和.h编写.除主入口点之外,库中的类和大多数内容都在命名空间DISCOVER_NS中.

以下是该项目的简要草图:

首先,承认,我缩短了一堆名称,因此代码更具可读性.

discover.cpp

  • 使用指向它的指针创建一个类对象,该对象名为DiscoverObject类型的MainObject.

  • 有一个extern"C"函数,它将theMainObject作为void*返回给调用者程序.

  • DiscoverObject有几个方法,并实例化在单独的cpp和.h中找到的其他类.一个特殊的方法名为Hello(),它可以满足您的期望,它会打印一个"hello"测试消息.


tester.cpp

  • 获取库的句柄

  • 获取返回theMainObject的函数的函数指针.

  • 执行函数(指针)并将返回的地址从void*转换为DISCOVER_NS :: DiscoverObject*aDiscoverObject.

  • 运行aDiscoverObject-> Hello().


我编译:

CC = @ g ++

gflags = -g3

cflags = -fPIC -Wall -pedantic

lib_linkflags:= -shared -fPIC -lstdc ++ -lrt -lpthread -rdynamic

tester_linkflags:= -ldl -lpthread

define = -D_ linux _ -D_DEBUG -D_IPC_ARCH_INTEL = 1 -D_THREAD_SAFE


现在,当我编译时,我得到以下错误:*Tester.cpp:142:未定义引用`Discover_NS :: DiscoverObject :: hello()'*

我还从discover.so中得到了一堆其他未定义的引用错误,例如:*discover.so:未定义引用`Discover_NS :: DeviceList :: ~DeviceList()*


我尝试在SO外部"C"中制作几乎所有东西.没有不同.

我尝试将语句放入discover.cpp,如下所示:extern void Discover_NS :: OtherClass :: method(args); 但这给了我关于"课外声明不是定义"错误的错误.


我知道这会有助于查看代码,但我需要时间来发布一些小的帖子.

谁能提出解决这个烂摊子的想法? …

c++ cross-platform shared-libraries undefined-reference

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