Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Ошибка при сборки сторонней библиотеки.


Автор: OlegIT 21.3.2022, 22:21
Собираю библиотеку db-18.1.40 компилятором mngw32 в консоли, CMake-ом создал make файл. На 60% получаю ошибку
Цитата

[ 60%] Building C object CMakeFiles/BerkeleyDB.dir/src/mutex/mut_win32.c.obj
In file included from C:/db-18.1.40/src/dbinc/mutex.h:15,
                 from C:/db-18.1.40/build_windows/db_int.h:1293,
                 from C:\db-18.1.40\src\mutex\mut_win32.c:12:
C:\db-18.1.40\src\mutex\mut_win32.c: In function '__db_win32_mutex_lock':
C:/db-18.1.40/src/dbinc/mutex_int.h:371:28: error: expected '(' before '{' token
 #define MUTEX_PAUSE  {__asm{_emit 0xf3}; __asm{_emit 0x90}}
                            ^
C:\db-18.1.40\src\mutex\mut_win32.c:176:4: note: in expansion of macro 'MUTEX_PAUSE'
    MUTEX_PAUSE
    ^~~~~~~~~~~
C:/db-18.1.40/src/dbinc/mutex_int.h:371:29: error: '_emit' undeclared (first use in this function); did you mean '_exit'?
 #define MUTEX_PAUSE  {__asm{_emit 0xf3}; __asm{_emit 0x90}}
                             ^~~~~
C:\db-18.1.40\src\mutex\mut_win32.c:176:4: note: in expansion of macro 'MUTEX_PAUSE'
    MUTEX_PAUSE
    ^~~~~~~~~~~

Т.е. компилятор не знает, что такое _emit. Правильно я понимаю?
Компилятор поставил не старый
Цитата

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")

В инете нашёл упоминание, что народ собирает эту библиотеку с помощью mngw32, но такой ошибки не упоминается. Как её победить?

Автор: xvr 23.3.2022, 17:40
Синтаксис __asm {} явно не от gcc (а mingw это именно он). Вангую по наличию в пути /build_windows/ что предполагается сборка Микрософтовским компилятором. Нужно смотреть в сорцы самой библиотеки и cmakefile'ов, подо что он заточен

Автор: OlegIT 23.3.2022, 21:42
gcc  у меня определено, картинка в приложении.
Много там вокруг всяких ifdef стоит. Есть там, рядом, то что нужно, по моему
Цитата

#ifdef HAVE_MUTEX_WIN32_GCC
#define    MUTEX_PAUSE  __asm__ volatile ("rep; nop" : : );

Понял, что в определение дефайнов разбираться нужно.

Автор: OlegIT 24.3.2022, 08:33
Похоже понял, где у меня ошибка, прочитал документацию про эти дефайны. Нужно дополнительно определить конкретную реализацию мьютекса так --with-mutex=x86/gcc-assembly .
Но как это сделать через CMakeList.txt пока не знаю.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)