brakuje deklaracji "extern C"

0

Mam projekt PJSIP napisany w C. Utworzyłem do nich swój projekt biblioteki dll library CLR. Ma być to biblioteka w C++/CLI. Ale kiedy w bibliotece użyję jakiejś funkcji z projektu PJSIP to mi wywala błąd:
Error 1 error LNK2028: unresolved token (0A00004F) "extern "C" int __cdecl pjsua_create(void)" (?pjsua_create@@$$J0YAHXZ) referenced in function "public: class System::Int32 ^ __clrcall PJSIPWrapper::GetPJsuaStatus(void)" (?GetPJsuaStatus@PJSIPLib@PJSIPWrapper@@$$FQ$AAMP$AAVInt32@System@@XZ) PJSIPWrapper.obj PJSIPWrapper

Z tego co doczytałem, to dzieje się tak dlatego, że funkcje w projekcie PJSIP muszą być opatrzone frazą "extern C" aby mogły być widoczne w C++.
Czy tak mam właśnie zrobić? Nie da się tego jakoś łatwiej zrobić? Bo tych funkcji jest ponad 1500 :(

0

Prawdopodobnie nie dodałeś biblioteki .lib do opcji linkera. W Visualu, we właściwościach projektu, Linker|Input|Additional dependencies, i tam trzeba dopisać odpowiednią libkę.

0

Wydaje mi się, że to nie to. Z tego co doczytałem czysty C nie rozpoznaje słowa "extern". Tego słowa można użyć tylko w C++. Tak więc wydaje mi się, że projekt muszę skompilować jakoś w C++ zamiast C. I gdzie się to ustawia?

EDIT:
Już znalazłem taką opcję w sekcji C/C++->Advanced

0

Na pewno nie jest to problem „nie rozpoznaje słowa extern”, bo błąd jest linkera a nie kompilatora.
Czy cały ten „projekt w C” wrzuciłeś do twojego projektu C++/CLI, czy projekt w C jest gotowy, skompilowany (lib? dll?) i tylko go używasz?
Powinieneś raczej to drugie, ale da się zrobić na oba sposoby.

Poza tym akurat C++/CLI nic tutaj nie zmienia, ten sam problem byś napotkał w czystym C++.

Tak bez kodu i informacji jak to dokładnie wygląda to ciężko coś powiedzieć.

0
  1. Jeżeli błąd jest linkera to jak zrobić żeby projekt był linkowany przez C++ a nie standardowo przez C?
  2. Jaką propercję można wpisać w VisualStudioPropertySheet *.vsprops aby projekt się skompilował w C++?

Projekt PJSIP nie jest skompilowany do dll-ki, ale jest wrzucony do C++/CLI.

Mam takiego propsa:

<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioPropertySheet
	ProjectType="Visual C++"
	Version="8.00"
	Name="pjproject-vs8-win32-common-defaults"
	>
	<Tool
		Name="VCCLCompilerTool"
		PreprocessorDefinitions="WIN32;PJ_WIN32=1;PJ_M_I386=1;"
	/>
	<Tool
		Name="VCLinkerTool"
		SubSystem="1"
		TargetMachine="1"
	/>
	<UserMacro
		Name="TargetCPU"
		Value="i386"
	/>
</VisualStudioPropertySheet>

Edit:
Nie jest to błąd linkera bo jak zadeklaruję by były externy to wyskakuje błąd c2059 a to jest błąd kompilatora.

0

extern "C" musi być ale tylko w C++.

czyli:

#ifdef __cplusplus
extern "C" {
#endif

/* tutaj cała zawartość nagłówka, już bez extern C */

#ifdef __cplusplus
}
#endif

Jest to jednocześnie odpowiedzią na pytanie jak to zrobić za jednym zamachem, a nie powtarzać przy każdej z 1500 funkcji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1