प्रायोगिक :: फाइलसिस्टम लिंकर त्रुटि


94

मैं gcc 6.0 के भीतर वास्तव में विकास के सिर पर नई c ++ 1z सुविधाओं का उपयोग करने का प्रयास करता हूं।

अगर मैं इस छोटे से उदाहरण की कोशिश करूँ:

#include <iostream>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
int main()
{
    fs::path p1 = "/home/pete/checkit";

    std::cout << "p1 = " << p1 << std::endl;
}

मुझे मिला:

/ opt / linux-gnu_6-20151011 / bin / g ++ --std = c ++ 1z main.cpp -O2 -g -o go
/tmp/ccaGzqFO.o: फ़ंक्शन में `` std: प्रायोगिक :: filesystem :: v1 :: __ cxx11 :: पथ :: पथ (char const (&) [36]) ':
/opt/linux-gnu_6-20151011/include/c++/6.0.0/experimental/bits/fs_path.h:167: अपरिभाषित संदर्भ `std: प्रायोगिक :: फ़ाइल :: :: :: __ cxx11 :: path :: _ M_split_cmpts () '
collect2: error: ld ने 1 निकास स्थिति लौटा दी

gcc संस्करण स्नैपशॉट linux-gnu_6-20151011 है

किसी भी संकेत कैसे नई सी ++ 1z सुविधाओं के लिए लिंक करने के लिए?

जवाबों:


154

Filesystem TS का C ++ 1z सपोर्ट से कोई लेना-देना नहीं है, यह C ++ 1z वर्किंग ड्राफ्ट का एक पूरी तरह से अलग स्पेसिफिकेशन नहीं है। GCC का कार्यान्वयन (GCC 5.3 और बाद में) C ++ 11 मोड में भी उपलब्ध है।

बस आपको -lstdc++fsइसका उपयोग करने के लिए लिंक करना होगा।

(संबंधित पुस्तकालय, libstdc++fs.aएक स्थैतिक पुस्तकालय है, इसलिए किसी भी स्थैतिक पुस्तकालय के साथ यह किसी भी ऑब्जेक्ट के बाद आना चाहिए जो लिंकेज कमांड में इस पर निर्भर है।)

अद्यतन नवंबर 2017: के साथ-साथ फ़ाइल टीएस, जीसीसी 8.x भी सी ++ 17 फ़ाइल पुस्तकालय, में परिभाषित के एक कार्यान्वयन है <filesystem>और नाम स्थान में std::filesystem(नायब कोई "प्रायोगिक" उन नामों में) का उपयोग करते समय -std=gnu++17या -std=c++17। GCC का C ++ 17 समर्थन अभी तक पूर्ण या स्थिर नहीं है, और जब तक इसे प्राइम टाइम के उपयोग के लिए तैयार नहीं माना जाता है, तब तक आपको -lstdc++fsC ++ 17 फाइलसिस्टम सुविधाओं के लिए लिंक करने की आवश्यकता होती है।

अद्यतन जनवरी 2019: जीसीसी 9 के साथ शुरू, सी ++ 17 std::filesystemघटकों का उपयोग बिना किया जा सकता है -lstdc++fs(लेकिन आपको अभी भी इसके लिए पुस्तकालय की आवश्यकता है std::experimental::filesystem)।


2
क्या यह कहीं भी प्रलेखित है, मैंने इसे स्वयं निर्धारित करने की कोशिश की और डब्ल्यू / कुछ भी नहीं आया, क्या मैंने यहां कुछ संसाधन याद किया?
शफीक यघमौर

2
@ शफीक्यगहमोर, मैंने अभी डॉक्स अपडेट किया है: gcc.gnu.org/onbuildocs/libstdc++/manual/… gcc.gnu.org/onbuildocs/libstdc++/manual/… gcc.gnu.org/onbuildocs/libstdc+/manual (सबसे नीचे)
जोनाथन वेकली

2
जब मैं इसका उपयोग करने की कोशिश करता हूं तो मुझे वही लिंकर त्रुटि मिलती है। c++ -lstd++fs main.cpp। मैं उपयोग कर रहा हूँgcc version 5.3.1 20151207 (Red Hat 5.3.1-2) (GCC)
alfC

15
ठीक है, -lstdc++fsलाइन के अंत में होना चाहिए (स्रोत फ़ाइल के बाद कम से कम)। मुझे समझ में नहीं आता कि कुछ -lxxxको अंत में होने की आवश्यकता क्यों है और दूसरों को नहीं।
alfC

5
@alfC क्योंकि लिंकर्स कैसे काम करते हैं। संदर्भों को बाएं से दाएं हल किया जाता है, इसलिए आपको उन वस्तुओं के बाद स्थिर पुस्तकालयों को सूचीबद्ध करने की आवश्यकता होती है जो उनका उपयोग करते हैं।
जोनाथन वेकली

31

यदि आप cmake का उपयोग कर रहे हैं, तो निम्न पंक्ति को इसमें जोड़ें CMakeLists.txt:

link_libraries(stdc++fs)

ताकि cmake संबंधित लाइब्रेरी के खिलाफ लिंक कर सके।


9
मैंने किया target_link_libraries(hello_world_ stdc++fs)और यह संकलित है।
सूर्यपति

13

क्लैंग 4.0+ के साथ, आपको इसके खिलाफ लिंक करना होगा libc++experimental.a

सुनिश्चित करें कि आप -ddlib = libc ++ (जैसा कि टिप्पणियों में उल्लेख किया गया है) के साथ libc ++ (libstdc ++ नहीं) का निर्माण कर रहे हैं


मुझे भी -stdlib = libc ++ की आवश्यकता थी क्योंकि मेरे क्लैंग संस्करण में अप्रत्याशित रूप से libstdc ++ का उपयोग किया गया था।
बोवी ओवंस

@BowieOwens धन्यवाद, कि स्पष्ट करने के लिए अद्यतन जवाब।
xxxon

जब आप कहते हैं "सुनिश्चित करें कि आप libc ++ के साथ निर्माण कर रहे हैं", तो मैं यह कैसे करूँ? (समाधान अधिमानतः CMake के साथ।)। धन्यवाद।
मैनिग्लोवर

1
@mannyglover -stdlib=libc++ याset(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
xaxxon

3

यहाँ एक डेमो है जो भविष्य में किसी के लिए सहायक हो सकता है:

env: el6,gcc/5.5.0

#include <iostream>
#include <string>
#include <experimental/filesystem>

int main()
{
    std::string path = std::experimental::filesystem::current_path();

    std::cout << "path = " << path << std::endl;
}

निम्नलिखित संकलन और परीक्षण कर रहे हैं। झंडे हैं -std=c++17 -lstdc++fs:

$ g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/apps/gcc-5.5.0/bin/../libexec/gcc/x86_64-unknown-linux-gnu/5.5.0/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: ../configure --prefix=/apps/gcc-5.5.0 --disable-multilib --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-languages=all
Thread model: posix
gcc version 5.5.0 (GCC)

$ ls -lrt /apps/gcc-5.5.0/lib64 | grep libstdc
-rwxr-xr-x. 1 root root  11272436 Jun 25 10:51 libstdc++.so.6.0.21
-rw-r--r--. 1 root root      2419 Jun 25 10:51 libstdc++.so.6.0.21-gdb.py
-rwxr-xr-x. 1 root root       976 Jun 25 10:51 libstdc++.la
-rwxr-xr-x. 1 root root  11272436 Jun 25 10:51 libstdc++.so
-rw-r--r--. 1 root root  10581732 Jun 25 10:51 libstdc++fs.a
-rw-r--r--. 1 root root  28985412 Jun 25 10:51 libstdc++.a
-rwxr-xr-x. 1 root root       916 Jun 25 10:51 libstdc++fs.la
-rwxr-xr-x. 1 root root  11272436 Jun 25 10:51 libstdc++.so.6

$ g++ filesystem-testing.cpp -lstdc++fs -std=c++17
$ ./a.out

$ g++ -std=c++17 filesystem-testing.cpp -lstdc++fs
$ ./a.out
path = /home/userid/projects-c++/filesystem-testing

यह झंडे के साथ भी काम करता है: -std=c++11

$ g++ -std=c++11 filesystem-testing.cpp -lstdc++fs
$ ./a.out
path = /home/userid/projects-c++/filesystem-testing

निम्न में संकलित त्रुटि थी _ZNSt12experimental10filesystem2v112current_pathB5cxx11Ev

$ g++ -std=c++17 -lstdc++fs filesystem-testing.cpp
/tmp/ccA6Q9oF.o: In function `main':
filesystem-testing.cpp:(.text+0x11): undefined reference to `_ZNSt12experimental10filesystem2v112current_pathB5cxx11Ev'
collect2: error: ld returned 1 exit status
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.