title: Undeclared identifier: PyUnicode_DecodeFSDefault
body: <p>I try to compile the example code from Python website <a href="https://docs.python.org/3/extending/embedding.html" rel="nofollow noreferrer">https://docs.python.org/3/extending/embedding.html</a>.  Everything works fine except the following line: </p>
  
  <pre><code> pName = PyUnicode_DecodeFSDefault(argv[1]);
  </code></pre>
  
  <p>I have Python 3.6 installed on my MacOS El Captain.  My make file looks like the following:</p>
  
  <pre><code>call_function:     call_function.o        
      gcc -o call_function call_function.o -export-dynamic -L/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/config-3.6m-darwin -lpython3.6m -lpthread -lm -ldl -lutil
  
  
  call_function.o:call_function.cpp    
      gcc -c call_function.cpp -I/Library/Frameworks/Python.framework/Versions/3.6/include/python3.6m
  </code></pre>
  
  <p>When I compile the C++ code, I get the following error:</p>
  
  <pre><code>gcc -c call_function.cpp -I/Library/Frameworks/Python.framework/Versions/3.6/include/python3.6m
  call_function.cpp:16:13: error: use of undeclared identifier    'PyUnicode_DecodeFSDefault'
  pName = PyUnicode_DecodeFSDefault(argv[1]);
          ^
  1 error generated.
  </code></pre>
  
  <p>Does anyone know how to fix the above error?  I would greatly appreciated for your help.</p>
  
  <p>Here is the complete example code:</p>
  
  <pre><code>#include &lt;Python/Python.h&gt;
  #include &lt;Python/unicodeobject.h&gt;
  
  int main(int argc, char *argv[])
  {
  PyObject *pName, *pModule, *pDict, *pFunc;
  PyObject *pArgs, *pValue;
  int i;
  
  if (argc &lt; 3) {
      fprintf(stderr,"Usage: call pythonfile funcname [args]\n");
      return 1;
  }
  
  Py_Initialize();
  pName = PyUnicode_DecodeFSDefault(argv[1]);
  // pName = PyUnicode_FromString(argv[1]);  &lt;-- also gives me an error
  
  /* Error checking of pName left out */
  
  pModule = PyImport_Import(pName);
  Py_DECREF(pName);
  
  if (pModule != NULL) {
      pFunc = PyObject_GetAttrString(pModule, argv[2]);
      /* pFunc is a new reference */
  
      if (pFunc &amp;&amp; PyCallable_Check(pFunc)) {
          pArgs = PyTuple_New(argc - 3);
          for (i = 0; i &lt; argc - 3; ++i) {
              pValue = PyLong_FromLong(atoi(argv[i + 3]));
              if (!pValue) {
                  Py_DECREF(pArgs);
                  Py_DECREF(pModule);
                  fprintf(stderr, "Cannot convert argument\n");
                  return 1;
              }
              /* pValue reference stolen here: */
              PyTuple_SetItem(pArgs, i, pValue);
          }
          pValue = PyObject_CallObject(pFunc, pArgs);
          Py_DECREF(pArgs);
          if (pValue != NULL) {
              printf("Result of call: %ld\n", PyLong_AsLong(pValue));
              Py_DECREF(pValue);
          }
          else {
              Py_DECREF(pFunc);
              Py_DECREF(pModule);
              PyErr_Print();
              fprintf(stderr,"Call failed\n");
              return 1;
          }
      }
      else {
          if (PyErr_Occurred())
              PyErr_Print();
          fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]);
      }
      Py_XDECREF(pFunc);
      Py_DECREF(pModule);
  }
  else {
      PyErr_Print();
      fprintf(stderr, "Failed to load \"%s\"\n", argv[1]);
      return 1;
  }
  Py_Finalize();
  return 0;
  }
  </code></pre>