Неопределенный символ в Visual Studio 2022 clang-clC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Неопределенный символ в Visual Studio 2022 clang-cl

Сообщение Anonymous »

Я пытаюсь скомпилировать одну функцию Intel Pin в Visual Studio 2022 с помощью компилятора clang-cl.
Я компилирую ее с помощью clang-cl, потому что новый вывод 4 имеет только скомпилированную версию clang.

Код: Выделить всё

VOID  Image(IMG img, VOID *v){
char    szFilePath[260];
unsigned long index;

PIN_GetLock(&lock, 1);
if (process_start != 0){
PIN_ReleaseLock(&lock);
return;
}
if (IMG_Valid(img)){
memset(szFilePath, 0, sizeof(szFilePath));
strncpy(szFilePath, IMG_Name(img).c_str(), sizeof(szFilePath)-1);
index = 0;
while (szFilePath[index] != 0){
szFilePath[index] = tolower(szFilePath[index]);
index++;
}

if (strstr(szFilePath, KnobProcessToTrace.Value().c_str())){
process_start = IMG_LowAddress(img);
process_end   = IMG_HighAddress(img);
}
}
PIN_ReleaseLock(&lock);

}
Это команда компоновщика:

Код: Выделить всё

/OUT:"D:\PinTrace\x64\Release\PinTrace.dll" /MANIFEST:NO /NXCOMPAT /PDB:"D:\PinTrace-src\PinTrace\x64\Release\PinTrace.pdb" /DYNAMICBASE "pin.lib" "libxed.lib" "pinos.lib" "pincrt.lib" "c++.lib" "pincrt4.lib" "rscproto.lib" "pinrt-adaptor-static.lib" "stdlib_new_delete.obj" "compiler-rt.lib" "crtbeginS.obj" /IMPLIB:"D:\PinTrace\x64\Release\PinTrace.lib" /DEBUG /DLL /BASE:"0x55000000" /ENTRY:"Ptrace_DllMainCRTStartup@12" /OPT:REF /INCREMENTAL:NO /PGD:"D:\PinTrace-src\PinTrace\x64\Release\PinTrace.pgd" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"PinTrace\x64\Release\PinTrace.dll.intermediate.manifest" /NODEFAULTLIB
И ошибки:

Код: Выделить всё

lld-link : error : : undefined symbol: Ptrace_DllMainCRTStartup@12
lld-link : error : undefined symbol: class std::basic_string const & __cdecl LEVEL_PINCLIENT::IMG_Name(class LEVEL_CORE::INDEX)
1>>>> referenced by PinTrace\x64\Release\main.obj:(void __cdecl Image(class LEVEL_CORE::INDEX, void *))
1>>>> referenced by PinTrace\x64\Release\main.obj:(void __cdecl ImageUnload(class LEVEL_CORE::INDEX, void *))
1>
1>lld-link : error : undefined symbol: unsigned int __cdecl LEVEL_PINCLIENT::IMG_LowAddress(class LEVEL_CORE::INDEX)
1>>>> referenced by PinTrace\x64\Release\main.obj:(void __cdecl Image(class LEVEL_CORE::INDEX, void *))
1>
1>lld-link : error : undefined symbol: unsigned int __cdecl LEVEL_PINCLIENT::IMG_HighAddress(class LEVEL_CORE::INDEX)
1>>>> referenced by PinTrace\x64\Release\main.obj:(void __cdecl Image(class LEVEL_CORE::INDEX, void *))
1>
1>lld-link : error : undefined symbol: unsigned int __cdecl LEVEL_PINCLIENT::TRACE_Address(class LEVEL_PINCLIENT::TRACE_CLASS *)
1>>>> referenced by PinTrace\x64\Release\main.obj:(void __cdecl Trace(class LEVEL_PINCLIENT::TRACE_CLASS *, void *))
1>
1>lld-link : error : undefined symbol: class LEVEL_PINCLIENT::COMPLEX_CALLBACKVAL_BASE * __cdecl LEVEL_PINCLIENT::PIN_AddContextChangeFunction(void (__cdecl *)(int, enum LEVEL_VM::CONTEXT_CHANGE_REASON, struct LEVEL_VM::CONTEXT const *, struct LEVEL_VM::CONTEXT *, int, void *), void *)
1>>>> referenced by PinTrace\x64\Release\main.obj:(main)
Эти функции определены в pin.lib, но компилятор не находит их там.
В файле image.ph IMG_Name определяется как:

Код: Выделить всё

const std::string& IMG_Name(IMG img);
но компилятор ищет его в pin.lib как:

Код: Выделить всё

class std::basic_string const & __cdecl LEVEL_PINCLIENT::IMG_Name(class LEVEL_CORE::INDEX)
Это причина того, что он его там не находит? Есть ли способ это исправить?

Подробнее здесь: https://stackoverflow.com/questions/798 ... 2-clang-cl
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»