首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用静态库的未定义引用

使用静态库的未定义引用
EN

Stack Overflow用户
提问于 2013-06-27 15:19:09
回答 1查看 242关注 0票数 1

我有一个非常简单的程序,使用门户网络编程接口4.0中提供的函数(源代码请参阅这里 )。下面是我的代码

main.cxx:

代码语言:javascript
复制
#include <stdio.h>
#include <portals4.h>

int main() {
  if (PtlInit() == PTL_OK) {
    printf("Successfully initialized...\n");
    PtlFini();
  }
  else {
    printf("Failed to initialize...\n");
    abort();
  }

  return 0;
}

Makefile:

代码语言:javascript
复制
.SUFFIXES: .cxx .o .h

CXX = g++

TARGET = test
SRCS   = main.cxx
OBJS   = $(SRCS:.cxx=.o)

PORTALS_ROOT = /home/brooks8/portals4
PORTALS_INCS = -I$(PORTALS_ROOT)/include
PORTALS_LIBS = -L$(PORTALS_ROOT)/lib -lportals -lportals_runtime

CXXFLAGS = -std=c++0x $(PORTALS_INCS)
LDFLAGS  = $(PORTALS_LIBS)

%.o: %.cxx
    $(CXX) -c $(CXXFLAGS) $<

$(TARGET) : $(OBJS)
    $(CXX) -o $@ $^ $(LDFLAGS)

$(SRCS) : $(HEADERS)

clean :
    rm -rf *.o $(TARGET)

当我运行make

代码语言:javascript
复制
g++ -c -std=c++0x -I/home/brooks8/portals4/include main.cxx
g++ -o test main.o -L/home/brooks8/portals4/lib -lportals -lportals_runtime
main.o: In function `main':
main.cxx:(.text+0x5): undefined reference to `PtlInit()'
main.cxx:(.text+0x1d): undefined reference to `PtlFini()'
collect2: ld returned 1 exit status
make: *** [test] Error 1

我在我的主目录(/home/brooks8/portals4)中安装了Portals4.0,portals4.h头文件位于/home/brooks8/portals4/include/portals4.h。在头文件中,两个函数都有明确的定义,以及分别在第38页( 这里) (Section 3.5.1)和第39页(Secion 3.5.2)上的Portals4.0规范(参见Secion 3.5.2)中定义的函数。

我不知道为什么我会收到那些不明确的推荐信,并希望能对我的处境提出任何意见。如果我能提供更多的信息来帮助我的问题,请告诉我。

谢谢。

编辑:

来自nm /home/brooks8/portals4/lib/libportals.a的结果

代码语言:javascript
复制
...
libportals_ib_la-ptl_fat_lib.o:
0000000000000000 r .LC0
0000000000000000 r .LC1
000000000000000e r .LC2
0000000000000011 r .LC3
0000000000000070 T PtlFini
0000000000000080 T PtlInit
...

来自file main.o的结果

代码语言:javascript
复制
main.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

来自file ~/portals4/lib/libportals.a的结果

代码语言:javascript
复制
~/portals4/lib/libportals.a: current ar archive

~/portals/lib/libportals.a中的对象文件

代码语言:javascript
复制
libportals_ib_la-ptl_atomic.o
libportals_ib_la-ptl_buf.o
libportals_ib_la-ptl_conn.o
libportals_ib_la-ptl_ct.o
libportals_ib_la-ptl_ct_common.o
libportals_ib_la-ptl_data.o
libportals_ib_la-ptl_eq.o
libportals_ib_la-ptl_eq_common.o
libportals_ib_la-ptl_evloop.o
libportals_ib_la-ptl_fat_lib.o
libportals_ib_la-ptl_id.o
libportals_ib_la-ptl_iface.o
libportals_ib_la-ptl_init.o
libportals_ib_la-ptl_iov.o
libportals_ib_la-ptl_le.o
libportals_ib_la-ptl_md.o
libportals_ib_la-ptl_me.o
libportals_ib_la-ptl_misc.o
libportals_ib_la-ptl_move.o
libportals_ib_la-ptl_mr.o
libportals_ib_la-ptl_ni.o
libportals_ib_la-ptl_obj.o
libportals_ib_la-ptl_param.o
libportals_ib_la-ptl_pt.o
libportals_ib_la-ptl_recv.o
libportals_ib_la-ptl_tgt.o
libportals_ib_la-ptl_rdma.o
libportals_ib_la-ptl_iface_ib.o
libportals_ib_la-ptl_mem.o
libportals_ib_la-ptl_queue.o
libportals_ib_la-ptl_shmem.o

来自file XXXX.o的结果

代码语言:javascript
复制
XXXX.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-27 15:26:55

您正在将应用程序构建为C++应用程序,您可能需要用extern "C“包装您的#include,如下所示:

代码语言:javascript
复制
extern "C" {
    #include <portal4.h>
    // other c-style headers here
}

通常,库作者都是自己管理的,但在这种情况下,门户可能不会吗?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17347055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档