Я пытаюсь запустить программу, которая использует функцию __builtin_popcountll
. Когда я скомпилирую код с помощью makefile, который компилирует исходные файлы с помощью команд/флагов, как показано ниже:
g++ -c -Wall 'pkg-config opencv --cflags' -I./include -O3 -fopenmp -msse4.2 src/Utils.cpp -o src/Utils.o
Он компилируется без каких-либо ошибок/предупреждений. Однако, когда я пытаюсь связать файлы объекта (.o) для создания исполняемого файла, я получаю undefined symbols
ошибки undefined symbols
.
Вот команда:
g++ src/BoostDesc.o src/Utils.o src/main.o 'pkg-config opencv --libs' -lgomp -o main
и это полная ошибка:
Undefined symbols for architecture x86_64:
"___builtin_popcountll", referenced from:
__ZN9boostDesc5Utils12matchHammingERKN2cv3MatERKSt6vectorIS2_SaIS2_EERS5_IS5_INS1_6DMatchESaISA_EESaISC_EE.omp_fn.0 in Utils.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [main] Error 1
Я просмотрел страницу man для gcc на веб-сайте Apple здесь, и это говорит о том, что флаг работает, и я предполагаю, что он должен работать и для g++. Может ли кто-нибудь подтвердить или опровергнуть возможность использования этой встроенной функции? Thnx!
g++ --version
возвращает это:
i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
Эта оптимизация указывается либо путем выполнения: -mpopcnt
либо -march=corei7
для компиляции.
Возьмите один образец:
% cat popcountl.c
int main(int argc , char** argv)
{
volatile long long x = 0xf0f0f0f0f0f0f0f0;
return __builtin_popcountll(x);
}
Оказывается, не поддерживается в этой версии g++:
~/D/e/popcountl [1]> /Applications/Xcode\ 4.6.3.app/Contents/Developer/usr/bin/g++ -mpopcnt -c popcountl.c
cc1plus: error: unrecognized command line option "-mpopcnt"
~/D/e/popcountl [1]> /Applications/Xcode\ 4.6.3.app/Contents/Developer/usr/bin/g++ -march=corei7 -c popcountl.c
popcountl.c:1: error: bad value (corei7) for -march= switch
popcountl.c:1: error: bad value (corei7) for -mtune= switch
~/D/e/popcountl> /Applications/Xcode\ 4.6.3.app/Contents/Developer/usr/bin/g++ --version
i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Однако работает с Xcode5 g++.
% g++ --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.0 (clang-500.2.75) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin12.5.0
Thread model: posix
g++ -mpopcnt -c popcountl.cpp
dhcp-3-127:~% otool -tV popcountl.o
popcountl.o:
:
0000000000000024 popcntq %rax, %rax
Похоже, что флаги для этой оптимизации отсутствуют в версии 4.6, предоставленной компилятором XCode, но присутствуют в версии 5.0 компиляторов XCode.
Имейте в виду, что вы на самом деле запускаете компилятор llvm с интерфейсом g++, поэтому он фактически не работает с официальным g++; это, вероятно, основная причина, по которой он не работает должным образом в этом случае.