brakuje deklaracji "extern C"

2012-11-14 10:16

Rejestracja: 12 lat temu

Ostatnio: 7 lat temu

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)" ([email protected]@$$J0YAHXZ) referenced in function "public: class System::Int32 ^ clrcall PJSIPWrapper::PJSIPLib::GetPJsuaStatus(void)" ([email protected]@[email protected]@[email protected]@@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 :(


"Wszystko co może być wynalezione, zostało wynalezione"
Charless H. Duell - komisarz urzędu patentowego U.S., 1899
edytowany 2x, ostatnio: maszynaz, 2012-11-14 10:31

Pozostało 580 znaków

2012-11-14 11:36

Rejestracja: 16 lat temu

Ostatnio: 15 godzin temu

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ę.

Pozostało 580 znaków

2012-11-14 12:00

Rejestracja: 12 lat temu

Ostatnio: 7 lat temu

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


"Wszystko co może być wynalezione, zostało wynalezione"
Charless H. Duell - komisarz urzędu patentowego U.S., 1899
edytowany 1x, ostatnio: maszynaz, 2012-11-14 12:10

Pozostało 580 znaków

2012-11-14 12:12

Rejestracja: 16 lat temu

Ostatnio: 15 godzin temu

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ć.

edytowany 1x, ostatnio: Azarien, 2012-11-14 12:13

Pozostało 580 znaków

2012-11-14 12:20

Rejestracja: 12 lat temu

Ostatnio: 7 lat temu

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.


"Wszystko co może być wynalezione, zostało wynalezione"
Charless H. Duell - komisarz urzędu patentowego U.S., 1899
edytowany 7x, ostatnio: maszynaz, 2012-11-14 12:55

Pozostało 580 znaków

2012-11-14 14:04

Rejestracja: 16 lat temu

Ostatnio: 15 godzin temu

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.

edytowany 3x, ostatnio: Azarien, 2012-11-14 14:05

Pozostało 580 znaków

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