【问题标题】:Using pthread in a MPI program has a Compilation error在 MPI 程序中使用 pthread 会出现编译错误
【发布时间】:2021-09-17 15:10:54
【问题描述】:

我正在尝试运行一个使用 pthread 的 MPI 程序。我可以在我的本地机器上编译和运行,但不能在服务器上这样做。

这是我用来编译的命令。

target1: TARGET=main
target2: TARGET=kmer_finaliser

CC = mpic++
# CPPFLAGS = -pg 
# CPPFLAGS = -lm -g -Wall -pthread
CPPFLAGS = -std=c++11 -pthread

USER_LIBS = -I /home/ruchin/sparsehash-sparsehash-2.0.4/src 

main: main.o extractor.o com.o kmer_dump.o thread_pool.o
    $(CC) $(CPPFLAGS) -o kmer_counter.out main.o extractor.o com.o kmer_dump.o thread_pool.o $(USER_LIBS)

main.o: main.cpp extractor.h com.h kmer_dump.h thread_pool.h
    $(CC) $(CPPFLAGS) -c main.cpp $(USER_LIBS)

kmer_finaliser: kmer_finaliser.o kmer_dump.o
    $(CC) $(CPPFLAGS) -o kmer_finaliser.out kmer_finaliser.o kmer_dump.o $(USER_LIBS)

kmer_finaliser.o: kmer_finaliser.cpp kmer_dump.h
    $(CC) $(CPPFLAGS) -c kmer_finaliser.cpp $(USER_LIBS)

extractor.o: extractor.cpp extractor.h
    $(CC) $(CPPFLAGS) -c extractor.cpp $(USER_LIBS)

com.o: com.cpp com.h
    $(CC) $(CPPFLAGS) -c com.cpp $(USER_LIBS)

kmer_dump.o: kmer_dump.cpp kmer_dump.h
    $(CC) $(CPPFLAGS) -c kmer_dump.cpp $(USER_LIBS)

thread_pool.o: thread_pool.cpp kmer_dump.h
    $(CC) $(CPPFLAGS) -c thread_pool.cpp $(USER_LIBS)

这是我得到的错误。

/usr/bin/ld: thread_pool.o: undefined reference to symbol 'pthread_create@@GLIBC_2.2.5'
/lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

【问题讨论】:

  • 请发布完整的命令行
  • 这是我使用的make文件,这里我也使用了-lpthread标志。没用。也喜欢@francesco 建议添加 -fopenmp 标志。也没有用
  • 您是否删除了所有目标文件并使用-pthread 再次运行make
  • 标志有点混乱。CPPFLAGSUSER_LIBS 仅用于源文件。要链接可执行主文件,您需要链接器标志,例如LDFLAGS="-lpthread"。那么 main 和 kmer_finalizer 的配方应该类似于 $(CC) -o outfile obj.o obj2.o ... $(LDFLAGS)
  • 好的,谢谢您的信息。

标签: c++ compilation pthreads mpi


【解决方案1】:

根据man page of g++,您还应该在编译中包含标志-pthread

-pthread 定义使用 POSIX 线程所需的附加宏 图书馆。您应该一致地使用此选项 编译和链接。此选项受支持 GNU/Linux 目标,大多数其他 Unix 衍生产品,以及 x86 Cygwin 和 MinGW 目标。

【讨论】:

  • 我尝试了 -pthread,但是当我添加该标志时,我得到了不同的编译错误。 “对ompi_mpi_comm_world 的未定义引用”就是其中之一。
  • @RuchinAmaratunga 尝试添加-fopenmp
猜你喜欢
  • 1970-01-01
  • 2016-05-24
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多