G ++ с Mountain Lion поддерживает -msse4.2?

0

Я пытаюсь запустить программу, которая использует функцию __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)
Теги:
macos
gcc
g++

1 ответ

0
Лучший ответ

Эта оптимизация указывается либо путем выполнения: -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++; это, вероятно, основная причина, по которой он не работает должным образом в этом случае.

  • 0
    Извините, но вы говорите, что XCode5 G ++ работает или только XCode5 GCC работает? У меня есть Xcode5 на моей машине
  • 0
    Xcode 5 g ++ работает - он сообщает как Apple LLVM версии 5.0, а не как 'i686-apple-darwin11-llvm-c ++ - 4.2 - я обновлю ответ (меня вызвали на собрание)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню