我是posix线程库的新手,我尝试从教程中编译示例代码:
g++ -lpthread agreement.cpp -o agreement
Run Code Online (Sandbox Code Playgroud)
但是我无法编译代码并收到以下错误消息:
a3q2.cpp:(.text+0x7e): undefined reference to `sem_open'
a3q2.cpp:(.text+0xab): undefined reference to `sem_wait'
a3q2.cpp:(.text+0x290): undefined reference to `sem_post'
a3q2.cpp:(.text+0x2af): undefined reference to `sem_close'
a3q2.cpp:(.text+0x2bb): undefined reference to `sem_unlink'
collect2: ld returned 1 exit status
make: *** [a3q2_exe] Error 1
Run Code Online (Sandbox Code Playgroud)
我知道编译工作需要-lpthread,但是我可能还需要其他任何选项才能解决问题吗?如果不是我如何安装"正确的"pthread库?
谢谢你的帮助!
仅在链接优化的目标文件时,而不是在链接未优化的目标文件时,我才会收到未定义的引用链接器错误。我不明白问题是什么或可能是什么。
这是我未优化的构建:
构建文件:../COMPASS.cpp 调用:GCC C++ 编译器 g++ -O0 -g3 -pg -Wall -c -fmessage-length=0 -Wno-sign-compare -fopenmp -MMD -MP -MF"COMPASS.d" -MT"COMPASS.d" -o"COMPASS.o" “../COMPASS.cpp” 完成的建筑:../COMPASS.cpp 构建文件:../PSA.cpp 调用:GCC C++ 编译器 g++ -O0 -g3 -pg -Wall -c -fmessage-length=0 -Wno-sign-compare -fopenmp -MMD -MP -MF"PSA.d" -MT"PSA.d" -o"PSA.o" “../PSA.cpp” 完成的建筑:../PSA.cpp 构建文件:../SAR.cpp 调用:GCC C++ 编译器 g++ -O0 -g3 -pg -Wall -c -fmessage-length=0 -Wno-sign-compare -fopenmp -MMD -MP -MF"SAR.d" -MT"SAR.d" -o"SAR.o" “../SAR.cpp” 完成的建筑:../SAR.cpp 构建文件:../constraints.cpp 调用:GCC C++ 编译器 g++ -O0 -g3 -pg -Wall -c -fmessage-length=0 -Wno-sign-compare -fopenmp …
我安装了CMocka 测试框架并尝试了示例代码:
#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
#include <cmocka.h>
/* A test case that does nothing and succeeds. */
static void null_test_success(void **state) {
(void) state; /* unused */
}
int main(void) {
const struct CMUnitTest tests[] = {
cmocka_unit_test(null_test_success),
};
return cmocka_run_group_tests(tests, NULL, NULL);
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试编译时,出现以下错误:
$ gcc -o Tests tests.c
/tmp/ccbwAXrr.o: In function `main':
tests.c:(.text+0x5e): undefined reference to `_cmocka_run_group_tests'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
我不太熟悉c ++以及实例化对象是如何工作的,所以这可能是一件非常简单的事情.当我用g ++编译时,我得到错误"未定义引用'Foo :: Foo(std :: string)'".我想创建一个类Foo的实例,它的构造函数中有一个字符串参数.这是代码:
#include <string>
using namespace std;
class Foo
{
public:
Foo(string s);
private:
string id;
};
Run Code Online (Sandbox Code Playgroud)
#include <string>
#include "Foo.h"
using namespace std;
Foo::Foo(string s)
{
id = s;
}
Run Code Online (Sandbox Code Playgroud)
#include <string>
#include "Foo.h"
using namespace std;
int main()
{
Foo foo("bar");
return 0;
}
Run Code Online (Sandbox Code Playgroud) 其他问题在下面添加,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); 但这给了我关于"课外声明不是定义"错误的错误.
我知道这会有助于查看代码,但我需要时间来发布一些小的帖子.
谁能提出解决这个烂摊子的想法? …
我正在做一个免费课程.下面的ocaml代码在我"make"时编译,但是一旦我试图把它放到顶层就会抱怨.为什么?
let main () =
(* Parsing arguments *)
let f_name = ref "" in
Arg.parse [ ] (fun s -> f_name := s) "Mini-Java analyzer";
(* Parsing of the source file *)
let simple_java_prog =
if String.compare !f_name "" = 0 then failwith "no program file given";
Localizing.current_file_name := !f_name;
let f_desc = open_in !f_name in
let lexbuf = Lexing.from_channel f_desc in
let java_prog =
try Java_parser.program Java_lexer.token lexbuf
with
| e ->
Printf.printf "Exception during parsing: %s\n"
(Printexc.to_string …Run Code Online (Sandbox Code Playgroud) 我有cuda代码,它调用.c文件中存在的函数,该文件的头文件已包含在我的cuda代码中.所以,总而言之,我有一个头文件,一个用于该头文件的C文件和一个CUDA代码.当我使用nvcc编译我的CUDA代码并指定我的cuda代码名称和c文件名时,我得到了我在CUDA代码中调用的函数的未定义引用,这些函数实际存在于我的C文件中.请帮助我理解我做错了什么,如何解决我的错误.
好吧我在下面粘贴我的代码...我最初没有发布它因为我认为它是链接器错误或其他什么.
#include "dbConnection.h"
#include "error.h"
#include "libpq-fe.h"
#include <stdio.h>
#include <stdlib.h>
#include "appCompileSwitches.h"
int makeConnection(PGconn** conn,const char* connInfo);
void executeQuery(PGconn* conn,PGresult** res,char* statement,int* rows,int* columns);
/***************************************
* main(), enough said
****************************************/
int main(int argc, char **argv)
{
PGconn *conn = NULL;
PGresult *res= NULL;
float** result;
char* statement = "select visit_no,brand_name from visit_sample limit 3";
int rows=0,columns=0; // WILL BE USED TO CUDAMALLOC gpu memory
const char* connInfo = "dbname = moxy";
if(!makeConnection(&conn,connInfo))
{
printf("failed to connect to Database!\n"); …Run Code Online (Sandbox Code Playgroud) 首先我在Ubuntu 12.04上安装sctp
sudo apt-get install libsctp-dev lksctp-tools
然后在我的.c文件中,我包括:
#include < netinet/in.h >
#include < netinet/sctp.h >
#include < sys/socket.h >
#include < stdlib.h >
#include < unistd.h >
Run Code Online (Sandbox Code Playgroud)
howerver,当我用gcc编译时,结果是:
undefined reference to `sctp_recvmsg'
undefined reference to `sctp_get_no_strms'
undefined reference to `sctp_sendmsg'
Run Code Online (Sandbox Code Playgroud)
怎么了?
我目前正在尝试用C++编写OpenGL程序.当我尝试编译我的程序时,我得到了未定义的引用,我在任何地方调用我的类的成员函数,尽管我从成员函数中调用这些函数...
这些是我得到的错误消息:
make clean && make
rm -f *.o *~ main
g++ -c main.cpp -o main.o
g++ -c renderer.cpp -o renderer.o
g++ -o main main.o renderer.o -lglut -lGL -lGLEW
renderer.o: In function `Renderer::resize(int, int)':
renderer.cpp:(.text+0x299): undefined reference to `Renderer::Perspective(float*, float, float, float, float)'
renderer.o: In function `Renderer::setupShaders()':
renderer.cpp:(.text+0x43d): undefined reference to `Renderer::loadShaderSrc(char const*, int&)'
renderer.cpp:(.text+0x456): undefined reference to `Renderer::loadShaderSrc(char const*, int&)'
renderer.cpp:(.text+0x4e7): undefined reference to `Renderer::printShaderInfoLog(int)'
renderer.cpp:(.text+0x4fe): undefined reference to `Renderer::printShaderInfoLog(int)'
renderer.cpp:(.text+0x568): undefined reference to `Renderer::printProgramInfoLog(int)'
collect2: Fehler: ld gab …Run Code Online (Sandbox Code Playgroud) 我是XS的初学者,花了一些时间在网上寻找这个答案而没有运气.问题是XS更改了函数的名称,当它进行编译时,我将得到一个未定义的引用错误.例如,考虑下面的XS代码:
size_t
matrixIndex (colIndex, rowIndex,nCols,nRows)
size_t colIndex
size_t rowIndex
size_t nCols
size_t nRows
CODE:
size_t register i;
RETVAL = (rowIndex * nCols) + colIndex;
OUTPUT:
RETVAL
Run Code Online (Sandbox Code Playgroud)
然后我尝试在下面这样的函数中使用它
int
matrixCopyColumnVector_dbl (colIndex,fromMatrix,nColsMatrix,nRowsMatrix,intoVector,nRowsVector)
size_t colIndex
SV * fromMatrix
size_t nColsMatrix
size_t nRowsMatrix
SV * intoVector
size_t nRowsVector
CODE:
size_t register x, n;
if( nRowsVector != nRowsMatrix) { RETVAL = 0; return RETVAL; }
n = 0;
for(x=0; x<= nRowsMatrix; x++) {
intoVector[n] = fromMatrix[matrixIndex /*USE OF FUNCTION HERE!!*/(colIndex,x,nColsMatrix,nRowsMatrix)];
n++;
}
RETVAL = 1; …Run Code Online (Sandbox Code Playgroud)