最近由於項目須要須要對rtcm數據進行解碼,rtklib提供了不少底層的函數,準備直接輸出標準DLL的方式供C#調用。下面把項目中引用rtklib源碼須要注意的地方記錄下。數組
1. 首先在vs2013中新建一個win32的dll項目,將rtk源碼放到工程路徑下(注意不是工程組所在路徑),命名爲rtklibsrcide
2. 在項目上添加一個文件夾[rtklibsrc]而後在文件夾上【添加現有項目】把rtklib的源文件(rtklibsrc下文件)加入工程。在rtklibsrc下創建rcv把(rtklibsrc\rcv)下面的文件也添加到工程函數
3. 如今開始編譯工程,你會發現不少錯誤。下面咱們一步步來解決錯誤。post
1> Q: error C1853: 「Debug\rtklibHelper.pch」預編譯頭文件來自編譯器的早期版本,或者預編譯頭爲 C++ 而在 C 中使用它(或相反) x:\xxxx\rtklibhelper\rtklibsrc\tle.c 1 1 rtklibHelper
A: 不使用預編譯頭網站
2> Q: 錯誤 1 error C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. x:\xxxx\rtklibhelper\rtklibhelper\rtklibsrc\tle.c spa
A: 其實提示上面已經告訴你方法了,須要你加入預編譯指令來取消這個錯誤[_CRT_SECURE_NO_WARNINGS].net
3> Q: error C4996: 'gethostbyname': Use getaddrinfo() or GetAddrInfoW() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings x:\xxxx\rtklibhelper\rtklibsrc\stream.c blog
A: 這個錯誤和上面相似,加入[_WINSOCK_DEPRECATED_NO_WARNINGS ]get
4> Q:接下來是一個這樣的錯誤 error C2466: 不能分配常量大小爲 0 的數組 x:\xxxx\rtklibhelper\rtklibsrc\rinex.c input
A:這個錯誤咱們來看一下, 在[MAXPRNGLO]上面按F12,看他的定義處
這個常量爲0,那麼不能進行編譯,咱們想上面同樣在預編譯器裏面加入 ENAGLO
5> Q: error C1083: 沒法打開包括文件: 「rtklib.h」: No such file or directory x:\xxxx\rtklibhelper\rtklibsrc\rcv\ublox.c 41 1 rtklibHelper
A: 添加附加目錄設置[.\rtklibsrc] , 注意是C/C++的常規下面,不是連接器的常規頁面。
6> Q: error LNK2005: _input_oem3 已經在 novatel.obj 中定義 x:\xxxx\rtklibhelper\novatel_old.obj rtklibHelper
A: 這個錯誤是添加文件的時候添加劇復了novatel_old.c不該該添加了,刪除便可
7>: Q: error LNK2019: 沒法解析的外部符號 _settspan,該符號在函數 _postpos 中被引用 x:\xxxx\rtklibhelper\postpos.obj rtklibHelper
error LNK2019: 沒法解析的外部符號 __imp__timeGetTime@0,該符號在函數 _tickget 中被引用 x:\xxxx\rtklibhelper\rtkcmn.obj rtklibHelper
error LNK2019: 沒法解析的外部符號 __imp__accept@12,該符號在函數 _accept_nb 中被引用 x:\xxxx\rtklibhelper\stream.obj rtklibHelper
A: 添加附加庫[鏈接器->輸入->附加依賴庫]添加winmm.lib, ws2_32.lib
8>:Q: error LNK2019: 沒法解析的外部符號 _showmsg,該符號在函數 _convrnx 中被引用 x:\xxxx\rtklibhelper\convrnx.obj rtklibHelper
A: 一查showmsg這個函數若是在DLL中須要本身定義,rtklib裏面已經作好了處理須要在預處理器裏面加入[DLL]便可。
預處理器裏面咱們添加了
_CRT_SECURE_NO_WARNINGS
_WINSOCK_DEPRECATED_NO_WARNINGS
ENAGLO
DLL
最後rtklibHelper編譯成功了,能夠開始編寫具體的功能函數了。
=========================================================================================
diocp|mybean官方網站: 主域名: www.diocp.org
diocp|mybean官方論壇: http://delphi.net.cn